汉字排序

/* 语言和地区两个因素组合确定一个字符集,即使用某个语言的某一地区会创建一个该地区的字符集来表示该语言的字符。*/
static const std::locale zh_CN_locale = std::locale("Chinese_china");  // 设置语言_地域(国家)
static const std::collate<char>& zh_CN_collate = std::use_facet<std::collate<char> >(zh_CN_locale);

int GetCharType(const WCHAR ch)
{
    // ASIIC码值 > 127 定义为中文字符    
    if ((ch > CONST_ASIIC_VALUE) || (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') )
        return 0;  
    else if (ch >= '0' && ch <= '9')
        return 1;
    return 2;   // 其他字符
}

int zh_CN_compare(const std::string &s1, const std::string &s2)//NOLINT(legal/name)
{
    const char *pb1 = s1.data(); // s1.data()
    const char *pb2 = s2.data(); // s2.data()
    return zh_CN_collate.compare(pb1, pb1 + s1.size(), pb2, pb2 + s2.size());
}

bool compare(const std::string &name1, const std::string &name2)
{
    WCHAR ch1 = name.at(0);
    WCHAR ch2 = name.at(0);
    int nType = GetCharType(ch1) - GetCharType(ch2);

    if ( 0 != nType )  // [不同类型] 字母(包括汉字) > 数字 > 特殊字符
        return nType < 0;
    // 中文按字母排序
    CHAR szName1[MAX_PATH], szName2[MAX_PATH];
    ConvertUnicodeToAnsi(name.c_str(), szName1, MAX_PATH);
    ConvertUnicodeToAnsi(name.c_str(), szName2, MAX_PATH);

    return zh_CN_compare(szName1, szName2) < 0;
}

std::sort(iter.begin(), iter.end(), compare);

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值