中文按拼音首字母排序的C++实现方案

先介绍下背景,最近有个需求,需要将用户的好友列表按照昵称的拼音首字母排序,类似于手机电话簿的联系人。一开始建议让终端同学去做这点,毕竟终端现有的电话簿模块已经实现了,不过终端同学说电话簿是系统组件,移植出来需要额外开发,导入库等等。建议后台来实现,终端直接接受处理好的数据,于是就由后台来做了。对于这个问题刚开始没有什么思路,不知道怎么着手,问题包括如何识别昵称里的中文、中文如何转换为拼音等等。咨询了组内的大佬,给出建议:首先,中文字符是可以识别出来的,因为我们编码都是统一的utf8编码,utf8是unicode编码的一种实现方式,在unicode编码标准中,中文字符的unicode编码范围是0X4E00~0X9FA5,可以通过检测这一范围来识别中文,这样,第一个问题解决了。其次,中文转拼音,预先准备好一个字典map,存储中文和拼音的对应关系,转换的时候直接读取map。这里中文拼音对应关系其实已有前辈做过,github上有了映射文件,可以直接拿来使用。

两个难题解决了,方案就出来了,分为三部分:首先是拼音map的生成处理,其次是中文的识别以及转换,最后是业务处理。demo的效果图如下:

图1. github上的中文拼音字典格式,链接放在参考文档里

中文按拼音首字母排序的C++实现方案_第1张图片

图2. 编译运行截图 

中文按拼音首字母排序的C++实现方案_第2张图片

参考代码:

1. 字典解析部分

/* PinyinMapParser.h */

#include 
#include 

using namespace std;
class PinyinMapParser 
{
public:
    PinyinMapParser(){}
    ~PinyinMapParser(){}

public:
    // 从文件中获取拼音字典
    static int GetPinYinMap(string& path, map& pin_yin_map);
};


/* PinyinMapParser.cpp */


#include      
#include       
#include "PinyinMapParser.h"


// 获取拼音映射文件
int PinyinMapParser::GetPinYinMap(string& path, map& pin_yin_map)
{
    // 路径校验
    if (path.empty())
    {
        cout<<"path emtpy, invalid param"<

2. 中文转换部分:

/* Convert.h */

#include 
#include 

using namespace std;
class Convert 
{
public:
    Convert(){}
    ~Convert(){}

public:
    // 昵称转换中文
    static int ConvertNicknameToPinyin(string& nickname, string& convert_str, map& pinyin_map);
    // 判断是否是中文
    static bool IsZh(const char* p);
};


/* Convert.cpp */


#include 
#include 
#include "Convert.h"


// 获取拼音映射文件
int Convert::ConvertNicknameToPinyin(string& nickname, string& convert_str, map& pinyin_map)
{
    // 检查昵称是否为空
    if (nickname.empty())
    {
        cout<<"nickname is empty, invalid"< 0xE9)
        {
            return false;
        }
        if(v == 0xE9 && v1 > 0xBE)
        {
            return false;
        }
        if(v == 0xE9 && v1 == 0xBE && v2 > 0xB5)
        {
            return false;
        }

        p += 3;

        return true;
    }

    return false;
}

3. 主函数

 #include 
#include 
#include 
#include "PinyinMapParser.h"
#include "Convert.h"


using namespace std;

int main (int argc, char** argv)
{
    int ret = 0;
    if (argc < 3)
    {
        cout<<"Usage: ./exe file_path"< m_pinyin;
    // 解析拼音字典
    ret = PinyinMapParser::GetPinYinMap(path, m_pinyin);
    if (ret != 0)
    {
        cout<<"GetPinYinMap error, ret:"<

 

参考资料:

1. 汉字 Unicode 编码范围

2. Unicode 和 UTF-8 关系

3. github 拼音链接

 

================================================================================================

Linux应用程序、内核、驱动、后台开发交流讨论群(745510310),感兴趣的同学可以加群讨论、交流、资料查找等,前进的道路上,你不是一个人奥^_^。...

你可能感兴趣的:(后台开发,c++)