C++ 中文拼音排序方法。
参考文档:http://zisxks.com/2013/10/25/sort-Chinese-characters-in-cpp/
采用locate.注意事项:排序的名字,如果出现某一个人,出现在顶上,可能是因为排序的名字前面是带有空格的,CString 类型的 可以采用 Trim() ,去掉前后的空格。
有个问题就是对于中文的多音字问题,这个函数排序的多音字,一般都会按照字母靠前的,但也有一部分是按照后字母靠后的音,猜想可能是多音字有多个枚举类型,挑的是里面的第一个,也有可能,多音字都有固定的拼音(查询资料未果)。
#include <iostream>
#include <string>
#include <locale>
#include <vector>
#include <algorithm>
using namespace std;
// Linux g++ locale 名称: "zh_CN.utf"
// VC2010 locale 名称: "Chinese"或者"Chinese_china"
#ifdef _MSC_VER
static const char *ZH_CN_LOCALE_STRING = "Chinese_china";
#else
static const char *ZH_CN_LOCALE_STRING = "zh_CN.utf8";
#endif
static const locale zh_CN_locale = locale(ZH_CN_LOCALE_STRING);
static const collate<char>& zh_CN_collate = use_facet<collate<char> >(zh_CN_locale);
bool zh_CN_less_than(const string &s1, const string &s2){
const char *pb1 = s1.data();
const char *pb2 = s2.data();
return (zh_CN_collate.compare(pb1, pb1+s1.size(), pb2, pb2+s2.size()) < );
}
int main(void){
vector<string> v;
v.push_back("啊");
v.push_back("阿");
v.push_back("第一");
v.push_back("第二");
v.push_back("第贰");
v.push_back("di");
v.push_back("第三");
v.push_back("liu");
v.push_back("第叁");
v.push_back("第四");
v.push_back("abc");
v.push_back("aa");
cout << "locale name: " << zh_CN_locale.name()<< endl;
sort(v.begin(), v.end(), zh_CN_less_than);
for(vector<string>::const_iterator p = v.begin(); p != v.end(); ++p){
cout << *p << endl;
}
return EXIT_SUCCESS;
}
对于单个的好友成员排序
module::UserInfoEntity user1,user2;
USES_CONVERSION;
user1.csName.Trim();
user2.csName.Trim();
const char* username1 = W2A(user1.csName);
const char* username2 = W2A(user2.csName);
return (UserListModule_Impl::zh_CN_collate.compare(username1, username1 + strlen(username1), username2, username2 + strlen(username2)) < );
}
对于群组的成员排序,一般都需要有群组的id ,所以需要重写排序的方法,使用时
应该用 ID 初始化一次 groupInfo.groupMemeberList.sort(CompareGroupMemberMethod(groupInfo.gId));
class CompareGroupMemberMethod
{
public:
CompareGroupMemberMethod(std::string gId) :m_comparegId(gId) {}; public: bool operator () (const std::string& code1, const std::string& code2)
{
module::GroupMemberInfo* pMemInfo1;
module::GroupMemberInfo* pMemInfo2;
pMemInfo1 = module::getGroupListModule()->getGMInfoBySId(m_comparegId, code1);
pMemInfo2 = module::getGroupListModule()->getGMInfoBySId(m_comparegId, code2); if (pMemInfo1 != NULL && pMemInfo2 != NULL)
{
CString memberName1 = util::stringToCString(pMemInfo1->name);
CString memberName2 = util::stringToCString(pMemInfo2->name);
memberName1.Trim();
memberName2.Trim(); USES_CONVERSION;
const char* mebName1 = W2A(memberName1);
const char* mebName2 = W2A(memberName2);
return (UserListModule_Impl::zh_CN_collate.compare(mebName1, mebName1 + strlen(mebName1), mebName2, mebName2 + strlen(mebName2)) < );
} return false;
}
C++ 中文拼音排序方法。的更多相关文章
- Android实现中文汉字笔划(笔画)、中文拼音排序、英文排序
发布时间:2018-11-16 技术:Android 概述 最近要做一个类似微信的,在登录界面选择国家地区的功能,微信有中文汉字笔画排序以及中文拼音排序等几种方式,如下所示: 简体中文 拼音排 ...
- JavaScript中文拼音排序函数
要对很多设备根据名称排序,找了找没有找到特别适合的,然后就自己写了一个根据中文拼音首字母排序的方法. github: https://github.com/haboll/sort.git
- sqlalchemy & python & datatables & javascript 中文拼音排序
近期有中文拼单排序需要,查询资料,mysql数据库有convert函数支持 select cname from channel order by convert(cname using gbk); # ...
- MySQL实现中文拼音排序
MySQL下新建一个表,默认采用utf8字符集,中文不能直接按照拼音进行排序. 例如以下语句: SELECT * FROM `tb_fixedassets` order by C_FANAME 得到的 ...
- MySQL按中文拼音排序
好多时候,我们希望查询出来的记录能够按照汉语拼音即英文的26个字母排序,但是utf字符集是外国人弄的,不是按照汉语拼音的顺序排列的,因此,我们需要将要排序的字段把编码设定为GBK或者BG2312再进行 ...
- sql按照中文拼音排序
select * from table order by convert(columnName using gbk) asc 注意:会导致全表扫描 建立冗余字段,插入数据时字段为convert(col ...
- Java中中文拼音的排序问题
最近做一个手机数据同步的应用开发,需要提供地址簿信息按照姓名的拼音次序进行排序.但仔细考察Java提供的Collator之后,发现其中文拼音排序存在严重的问题.Java提供Collator来支持不同语 ...
- ios 汉字字符串数组拼音排序
ios没有提供简单的汉字拼音排序方法,在网上看到了oc方法,这里写以下对应的swift方法 var stringCompareBlock: (String,String)->Bool = { ( ...
- 使mysql按中文字段排序
http://ourmysql.com/archives/391 测试后我发现,gbk不仅对字符内容是按拼音排序的,对数字也是一样,使用时需注意! 另外一篇文章: MySQL按中文拼音排序
随机推荐
- Python计算分位数
Python计算分位数 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/gdkyxy2013/article/details/80911514 ...
- 大数据学习环境搭建(CentOS6.9+Hadoop2.7.3+Hive1.2.1+Hbase1.3.1+Spark2.1.1)
node1 192.168.1.11 node2 192.168.1.12 node3 192.168.1.13 备注 NameNode Hadoop Y Y 高可用 DateNode Y Y Y R ...
- 【算法随记】Canny边缘检测算法实现和优化分析。
以前的博文大部分都写的非常详细,有很多分析过程,不过写起来确实很累人,一般一篇好的文章要整理个三四天,但是,时间越来越紧张,后续的一些算法可能就以随记的方式,把实现过程的一些比较容易出错和有价值的细节 ...
- exception The valid characters are defined in RFC 7230 and RFC 3986
1.情景展示 当你使用浏览器进行问号传参与后台进行交互时,会报这个异常. tomcat控制台报错信息如下: The valid characters are defined in RFC 7230 ...
- spring boot 搭建
http://www.ityouknow.com/springboot/2018/06/12/spring-boo-java-simple.html 在http://start.spring.io/下 ...
- 开源组件ExcelReport 3.x.x 使用手册(为.netcore而来)
ExcelReport转眼已经开源4年了,期间有很长时间也停止了对它的维护.18年年末有人联系到我,说“兄弟,ExcelReport不错,但什么时候支持.netcore呢?”.我寥寥的回了几句搪塞的话 ...
- [Memcached]分布式缓存系统Memcached在Asp.net下的应用
Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached ...
- [Java并发编程(三)] Java volatile 关键字介绍
[Java并发编程(三)] Java volatile 关键字介绍 摘要 Java volatile 关键字是用来标记 Java 变量,并表示变量 "存储于主内存中" .更准确的说 ...
- java 爬取 国税局 省市区级联关系
爬取网址 http://www.stats.gov.cn/tjsj/tjbz/tjyqhdmhcxhfdm/2018/index.html 因为数据比较大,存储为一个json,会内存溢出. 所以按照每 ...
- 【C语言】 重拾
[C语言] 因为以前学过C语言,只不过太长时间不用,已经忘得差不多了… 所以这篇文章的性质是把C语言中一些对于现在的我不是很符合预期的知识点记录一下. ■ HelloWorld程序 HelloWorl ...