按拼音或者笔画排序你的字符串

来源:互联网 发布:徽商银行待遇知乎 编辑:程序博客网 时间:2024/04/28 04:18
 很多人会很好奇,怎么数据库能够根据拼音排序的?网上能搜到很多网友自己写的处理按拼音排序的模块。
GB2312的一级汉字确实是按拼音排列的,我们可以简单的比较它们的编码,但是二级汉字呢?如果你的程序是使用Unicode字符串的呢?

不用担心,Windows I18N API已经给我们提供了相关的函数来实现这一切,你所需要做的就是传入一个合适的参数。

下面的函数会将GBK中所有的汉字按拼音或者笔画序输出到控制台,非常简单,对吗?

#include <windows.h>
#include <algorithm>
#include <cstdio>

char Buf[65536][3];
char *BufT[65536];

bool Comp(const char *str1,const char *str2)
{
    //SORT_CHINESE_PRCP    拼音
    //SORT_CHINESE_PRC    笔画
    int t=::CompareString(MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRCP),0,str1,-1,str2,-1);
    return t<2;
}

int main()
{
    //生成GBK码表
    int n=0;
    for (int i=0x81;i<=0xFE;++i)
    {
        for (int j=0x40;j<=0x7E;++j) {
            Buf[n][0]=(char)i;
            Buf[n][1]=(char)j;
            ++n;
        }
        for (int j=0x80;j<=0xFE;++j) {
            Buf[n][0]=(char)i;
            Buf[n][1]=(char)j;
            ++n;
        }
    }

    for (int i=0;i<n;++i) BufT[i]=&Buf[i][0];
    std::sort(&BufT[0],&BufT[n],Comp);
    for (int i=0;i<n;++i) printf("%s",BufT[i]);
}

附上一篇非常详尽的描述Windows I18N API的文章:
http://www.woodenhead.org/microsoft/International%20Programming%20for%20Microsoft%20Windows/9.htm
原创粉丝点击