很多人会很好奇,怎么数据库能够根据拼音排序的?网上能搜到很多网友自己写的处理按拼音排序的模块。
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
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