/* 语言和地区两个因素组合确定一个字符集,即使用某个语言的某一地区会创建一个该地区的字符集来表示该语言的字符。*/
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);