最近要做一个根据汉字取拼音的首字母进行查询的电话簿项目,网上关于这方面的资料很多,因为是基于wince开发的,需要将unicode编码转换成ansi编码,将源码贴于此,希望对网友有用。

//若含有非汉字的字符要保留
CString GetFirstLetter(LPCTSTR strName)
{
static int li_SecPosValue[] = {
1601, 1637, 1833, 2078, 2274, 2302, 2433, 2594, 2787, 3106, 3212,
3472, 3635, 3722, 3730, 3858, 4027, 4086, 4390, 4558, 4684, 4925, 5249
};
static char* lc_FirstLetter[] = {
"A", "B", "C", "D", "E", "F", "G", "H", "J", "K", "L", "M", "N", "O",
"P", "Q", "R", "S", "T", "W", "X", "Y", "Z"
};
static char* ls_SecondSecTable =
"CJWGNSPGCGNE[Y[BTYYZDXYKYGT[JNNJQMBSGZSCYJSYY[PGKBZGY[YWJKGKLJYWKPJQHY[W[DZLSGMRYPYWWCCKZNKYYGTTNJJNYKKZYTCJNMCYLQLYPYQFQRPZSLWBTGKJFYXJWZLTBNCXJJJJTXDTTSQZYCDXXHGCK[PHFFSS[YBGXLPPBYLL[HLXS[ZM[JHSOJNGHDZQYKLGJHSGQZHXQGKEZZWYSCSCJXYEYXADZPMDSSMZJZQJYZC[J[WQJBYZPXGZNZCPWHKXHQKMWFBPBYDTJZZKQHY"
"LYGXFPTYJYYZPSZLFCHMQSHGMXXSXJ[[DCSBBQBEFSJYHXWGZKPYLQBGLDLCCTNMAYDDKSSNGYCSGXLYZAYBNPTSDKDYLHGYMYLCXPY[JNDQJWXQXFYYFJLEJPZRXCCQWQQSBNKYMGPLBMJRQCFLNYMYQMSQYRBCJTHZTQFRXQHXMJJCJLXQGJMSHZKBSWYEMYLTXFSYDSWLYCJQXSJNQBSCTYHBFTDCYZDJWYGHQFRXWCKQKXEBPTLPXJZSRMEBWHJLBJSLYYSMDXLCLQKXLHXJRZJMFQHXHWY"
"WSBHTRXXGLHQHFNM[YKLDYXZPYLGG[MTCFPAJJZYLJTYANJGBJPLQGDZYQYAXBKYSECJSZNSLYZHSXLZCGHPXZHZNYTDSBCJKDLZAYFMYDLEBBGQYZKXGLDNDNYSKJSHDLYXBCGHXYPKDJMMZNGMMCLGWZSZXZJFZNMLZZTHCSYDBDLLSCDDNLKJYKJSYCJLKWHQASDKNHCSGANHDAASHTCPLCPQYBSDMPJLPZJOQLCDHJJYSPRCHN[NNLHLYYQYHWZPTCZGWWMZFFJQQQQYXACLBHKDJXDGMMY"
"DJXZLLSYGXGKJRYWZWYCLZMSSJZLDBYD[FCXYHLXCHYZJQ[[QAGMNYXPFRKSSBJLYXYSYGLNSCMHZWWMNZJJLXXHCHSY[[TTXRYCYXBYHCSMXJSZNPWGPXXTAYBGAJCXLY[DCCWZOCWKCCSBNHCPDYZNFCYYTYCKXKYBSQKKYTQQXFCWCHCYKELZQBSQYJQCCLMTHSYWHMKTLKJLYCXWHEQQHTQH[PQ[QSCFYMNDMGBWHWLGSLLYSDLMLXPTHMJHWLJZYHZJXHTXJLHXRSWLWZJCBXMHZQXSDZP"
"MGFCSGLSXYMJSHXPJXWMYQKSMYPLRTHBXFTPMHYXLCHLHLZYLXGSSSSTCLSLDCLRPBHZHXYYFHB[GDMYCNQQWLQHJJ[YWJZYEJJDHPBLQXTQKWHLCHQXAGTLXLJXMSL[HTZKZJECXJCJNMFBY[SFYWYBJZGNYSDZSQYRSLJPCLPWXSDWEJBJCBCNAYTWGMPAPCLYQPCLZXSBNMSGGFNZJJBZSFZYNDXHPLQKZCZWALSBCCJX[YZGWKYPSGXFZFCDKHJGXDLQFSGDSLQWZKXTMHSBGZMJZRGLYJB"
"PMLMSXLZJQQHZYJCZYDJWBMYKLDDPMJEGXYHYLXHLQYQHKYCWCJMYYXNATJHYCCXZPCQLBZWWYTWBQCMLPMYRJCCCXFPZNZZLJPLXXYZTZLGDLDCKLYRZZGQTGJHHGJLJAXFGFJZSLCFDQZLCLGJDJCSNZLLJPJQDCCLCJXMYZFTSXGCGSBRZXJQQCTZHGYQTJQQLZXJYLYLBCYAMCSTYLPDJBYREGKLZYZHLYSZQLZNWCZCLLWJQJJJKDGJZOLBBZPPGLGHTGZXYGHZMYCNQSYCYHBHGXKAMTX"
"YXNBSKYZZGJZLQJDFCJXDYGJQJJPMGWGJJJPKQSBGBMMCJSSCLPQPDXCDYYKY[CJDDYYGYWRHJRTGZNYQLDKLJSZZGZQZJGDYKSHPZMTLCPWNJAFYZDJCNMWESCYGLBTZCGMSSLLYXQSXSBSJSBBSGGHFJLYPMZJNLYYWDQSHZXTYYWHMZYHYWDBXBTLMSYYYFSXJC[DXXLHJHF[SXZQHFZMZCZTQCXZXRTTDJHNNYZQQMNQDMMG[YDXMJGDHCDYZBFFALLZTDLTFXMXQZDNGWQDBDCZJDXBZGS"
"QQDDJCMBKZFFXMKDMDSYYSZCMLJDSYNSBRSKMKMPCKLGDBQTFZSWTFGGLYPLLJZHGJ[GYPZLTCSMCNBTJBQFKTHBYZGKPBBYMTDSSXTBNPDKLEYCJNYDDYKZDDHQHSDZSCTARLLTKZLGECLLKJLQJAQNBDKKGHPJTZQKSECSHALQFMMGJNLYJBBTMLYZXDCJPLDLPCQDHZYCBZSCZBZMSLJFLKRZJSNFRGJHXPDHYJYBZGDLQCSEZGXLBLGYXTWMABCHECMWYJYZLLJJYHLG[DJLSLYGKDZPZXJ"
"YYZLWCXSZFGWYYDLYHCLJSCMBJHBLYZLYCBLYDPDQYSXQZBYTDKYXJY[CNRJMPDJGKLCLJBCTBJDDBBLBLCZQRPPXJCJLZCSHLTOLJNMDDDLNGKAQHQHJGYKHEZNMSHRP[QQJCHGMFPRXHJGDYCHGHLYRZQLCYQJNZSQTKQJYMSZSWLCFQQQXYFGGYPTQWLMCRNFKKFSYYLQBMQAMMMYXCTPSHCPTXXZZSMPHPSHMCLMLDQFYQXSZYYDYJZZHQPDSZGLSTJBCKBXYQZJSGPSXQZQZRQTBDKYXZK"
"HHGFLBCSMDLDGDZDBLZYYCXNNCSYBZBFGLZZXSWMSCCMQNJQSBDQSJTXXMBLTXZCLZSHZCXRQJGJYLXZFJPHYMZQQYDFQJJLZZNZJCDGZYGCTXMZYSCTLKPHTXHTLBJXJLXSCDQXCBBTJFQZFSLTJBTKQBXXJJLJCHCZDBZJDCZJDCPRNPQCJPFCZLCLZXZDMXMPHJSGZGSZZQLYLWTJPFSYASMCJBTZKYCWMYTCSJJLJCQLWZMALBXYFBPNLSFHTGJWEJJXXGLLJSTGSHJQLZFKCGNNNSZFDEQ"
"FHBSAQTGYLBXMMYGSZLDYDQMJJRGBJTKGDHGKBLQKBDMBYLXWCXYTTYBKMRTJZXQJBHLMHMJJZMQASLDCYXYQDLQCAFYWYXQHZ";
//将unicode编码转换成ANSI编码
int nSecondSecTable = strlen(ls_SecondSecTable);
int stringlen = wcslen(strName);
char   *buffer = NULL;
buffer = new char[stringlen * sizeof(TCHAR) + 1];
ZeroMemory(buffer, stringlen * sizeof(TCHAR) + 1);
WideCharToMultiByte(CP_ACP,NULL,strName,stringlen,buffer,stringlen * sizeof(TCHAR) + 1,NULL,NULL);
//
string result;
int nHigh, nLow, nCode;
int i,j;
for (i = 0; i < stringlen*sizeof(TCHAR); i++)
{
//找到汉字的机内码
nHigh = (UCHAR) (buffer[i + 0]);
nLow = (UCHAR) (buffer[i + 1]);
if (nHigh < 0xA1 || nLow < 0xA1)    //非汉字保留
{
result += buffer[i];
continue;
}
else
{
//一级汉字机内码与区位码的关系
//机内码高字节 = 区码 + 0XA0;
//机内码低字节 = 位码 + 0XA0;
//区位码 = (机内码高字节 - 0XA0) * 100 + 机内码低字节 - 0XA0;
nCode = (nHigh - 0XA0) * 100 + nLow - 0XA0;
}
if (nCode > 1600 && nCode < 5590)       //一级汉字 16-55区
{
for (j = 22; j >= 0; j--)
{
if (nCode >= li_SecPosValue[j])
{
result += lc_FirstLetter[j];
i ++;
break;
}
}
continue;
}
else  //二级汉字通过查表  56-87区;将二级汉字拼音的首字母放在ls_SecondSecTable表中
{
i++;
//根据机内码转换成ls_SecondSecTable表的下标
nCode = (nHigh - 0XA0 - 56) * 94 + nLow - 0XA0 - 1;
if (nCode >= 0 && nCode < nSecondSecTable)
result += ls_SecondSecTable[nCode];
else
{
result += (char) nHigh;
result += (char) nLow;
}
}
}
//将ANSI编码转换成unicode编码
TCHAR *pwcsTemp = new TCHAR[stringlen+1];
ZeroMemory(pwcsTemp, (stringlen+1) * sizeof(TCHAR));
MultiByteToWideChar(CP_ACP,NULL,result.c_str(),result.length(),pwcsTemp,stringlen);
CString str = pwcsTemp;
//
delete []pwcsTemp;
pwcsTemp = NULL;
delete []buffer;
buffer = NULL;
return str;
}

不足之处就是对多音字,无法区分,如东莞 DW,莞尔 WE。

附录:汉字编码原则
1.国家标准汉字代码体系
  汉字字数繁多,属性丰富,因而汉字代码体系也较复杂,包括:
  (1)汉字机内码。它们是汉字在计算机汉字系统内部的表示方法,是计算机汉字系统
的基础代码。
  (2)汉字交换码。它们是国标汉字(如机内码)进行信息交换的代码标准。
  (3)汉字输入码。它们是在计算机标准键盘上输入汉字用到的各种代码体系。
  (4)汉字点阵码。它们是在计算机屏幕上显示和在打印机上打印输出汉字的代码体系。
  (5)汉字字形控制码。为了打印各种风格的字体和字形所制定的代码。
  这些代码系统有的必须有统一的国家标准,有的则不要求统一。近年来我国已经制定
系列汉字信息处理方面的国家标准,今后将继续完善,并与国际上求得统一。

2. 国家标准汉字交换码
  我国制定了"中华人民共和国国家标准信息交换汉字编码",标准代号为GB2312―80,
这种编码又称为国标码。在国标码的字符集中共收录了一级汉字3755个,二级汉字3008
个,图形符号682个,三项字符总计7445个。
  在国标GD2312―80中规定,所有的国标汉字及符号分配在一个94行、94列的方阵中,
方阵的每一行称为一个"区",编号为01区到94区,每一列称为一个"位",编号为01
位到94位,方阵中的每一个汉字和符号所在的区号和位号组合在一起形成的四个阿拉伯
数字就是它们的"区位码"。区位码的前两位是它的区号,后两位是它的位号。用区位码
就可以唯一地确定一个汉字或符号,反过来说,任何一个汉字或符号也都对应着一个唯一
的区位码。汉字"母"字的区位码是3624,表明它在方阵的36区24位,问号"?"的区
位码为0331,则它在03区3l位。
  所有的汉字和符号所在的区分为以下四个组:
    (1)01区到15区。图形符号区,其中01区到09区为标准符号区,10区到15区为
自定义符号区。
  01区到09区的具体内容如下;
  1)01区。一般符号202个,如间隔符、标点、运算符、单位符号及制表符;
  2)02区。序号60个,如1.~20.、(1)~(20)、①~⑩及(一)~(十);
  3)03区。数字22个,如0―9及X一XII,英文字母52个,其中大写A―Z、小写
a―z各26个;
  4)04区。日文平假名83个;
  5)05区。日文片假名86个;
  6)06区。希腊字母48个;
  7)07区。俄文字母66个;
  8)08区。汉语拼音符号a―z26个;
  9)09区。汉语拼音字母37个。
    (2)16区到55区。一级常用汉字区,包括了3755个一统汉字。这40个区中的汉字
是按汉语拼音排序的,同音字按笔划顺序排序。其中55区的90一94位未定义汉字。
    (3)56区到87区。二级汉字区,包括了3008个二级汉字,按部首排序。
    (4)88区到94区。自定义汉字区。
    第10区到第15区的自定义符号区和第88区到第94区的自定义汉字区可由用户自行
  定义国标码中未定义的符号和汉字。

3. 国家标准汉字机内码
    汉字的机内码是指在计算机中表示一个汉字的编码。机内码与区位码稍有区别。如上
所述,汉字区位码的区码和位码的取值均在1~94之间,如直接用区位码作为机内码,就
会与基本ASCII码混淆。为了避免机内码与基本ASCII码的冲突,需要避开基本ASCII码
中的控制码(00H~1FH),还需与基本ASCII码中的字符相区别。为了实现这两点,可以
先在区码和位码分别加上20H,在此基础上再加80H(此处"H"表示前两位数字为十六
进制数)。经过这些处理,用机内码表示一个汉字需要占两个字节,分别  称为高位字
节和低位字节,这两位字节的机内码按如下规则表示:
    高位字节=区码+20H+80H(或区码+A0H)
    低位字节=位码+20H+80H(或位码+AOH)
    由于汉字的区码与位码的取值范围的十六进制数均为01H~5EH(即十进制的01~94),
  所以汉字的高位字节与低位字节的取值范围则为A1H~FEH(即十进制的161~254)。
    例如,汉字"啊"的区位码为1601,区码和位码分别用十六进制表示即为1001H,它
的机内码的高位字节为B0H,低位字节为A1H,机内码就是B0A1H。

4. 汉字的输入码
    在计算机标准键盘上,汉字的输入和西文的输入有很大的不同。西文的输入,击一次
键就直接输入了相应的字符或代码,"键入"和"输入"是同一个含义。但是在计算机上
进行汉字输入时,"键入"是指击键的动作即键盘操作的过程,而"输入"则是把所需的
汉字或字符送到指定的地方,是键盘操作的目的。目前已有多种汉字输入方法,因此就有
多种汉字输入码。汉字输入码是面向输入者的,使用不同的输入码其操作过程不同,但是
得到的结果是一样的。不管采用何种输入方法,所有输入的汉字都以机内码的形式存储在
介质中,而在进行汉字传输时,又都以交换码的形式发送和接收。
    国标GB2312―80规定的区位码和沿用多年的电报码都可以作为输入码。这类汉字编码
和输入码是一一对应的,具有标准的性质,它们编码用的字符是10个阿拉伯数字,每个
汉字的码长均为等长的四个数码。
    其他编码的种类很多,可从以下几点加以讨论:
    (2)编码类型。可分为拼音码、字形码、音形结合码等类型。
    (2)编码规则。不同的编码方案有很大的不同,有的规则简单,学习起来较容易记忆,'
  有的规则复杂,较难记亿。
    (3)编码字符集。有用字母键的,有用数字键的,有用字母键加数字键的,或者用了
  更多的键作编码字符集的。
    (4)编码长度。它与编码字符集的大小有关,字符集越大,编码长度越短。采用26
  个字母的编码,其码长一般为四位。
    (5)对应关系。除上面提到的区位码和电报码为一一对应的无重码编码外,其他现有
的编码方案均有一定数量的重码。所谓重码即一码对应多字。有许多编码为了增加输入的
灵活性,同一汉字用多个码来对应,例如双音编码。
    (6)单宁和词汇的编码。现有的编码方案,为了提高效率,除了单字外还规定了词汇
的编码,甚至使用者可以自行增加词汇库中的词汇,但在提高效率的同时也增加了记亿和
操作的复杂性。
    (7)码表的类型和大小。从汉字输入码到机内码的转换一股需要在机内检索码表。如
果输入码和机内码存在简单的函数关系,有公式可以计算,如区位码等编码就不需要码表,
其他没有简单函数关系的编码就需要码表。码表大小与数据结构、单字数量、词汇数量等
因素有关。国标血2312―80规定的6763个一、二级汉字,备类编码的码表从几千字节到
几万字节。随着词汇旦的增加,有的码表达到了若干兆字节。

5. 汉字的点阵码
    汉字的显示和输出,普遍采用点阵方法。由于汉字数量多且字形变化大,对不同字形
汉字的输出,就有不同的点阵字形。所谓汉字的点阵码,就是汉字点阵字形的代码。存储
在介质中的全部汉字的点阵码又称为字库。    .
  16x16点阵的汉字其点阵有16行,每一行上有16个点。如果每一个点用一个二进制
位来表示,则每一行有16个二进制位,需用两个字节来存放每一行上的16个点,并且规
定其点阵中二进制位0为白点,1为黑点,这样一个16X16点阵的汉字需要用2×t6即32
个字节来存放。依次类推,24×24点阵和32×32点阵的汉字则依次要用72个字节和128
个字节存放一个汉字,构成它在字库中的字模信息。
    要显示或打印输出一个汉字时,计算机汉字系统根据该汉字的机内码找出其字模信息
在字库中的位置,再取出其字模信息作为字形在屏幕上显示或在打印机上打印输出

参考资料:http://www.cnblogs.com/thankgoodness/articles/1384078.html

参考资料:http://hi.baidu.com/shi51314/blog/item/667be536ed70e9280b55a93c.html

VC 获取汉字拼音首字母(unicode编码)上相关推荐

  1. iOS 获取汉字拼音首字母

    iOS获取汉字首字母 这个一般用在通讯里排序居多,我这里就是用到了通讯里的排序,然后就来mark一下,记录. 核心代码 char pinyinFirstLetter(unsigned short ha ...

  2. 【C#】获取汉字拼音首字母和全拼

    文章目录 利用CJK统一表意符号获取首字母 获取首字母和全拼 另附sql server解决方案 来源 java的同学可以了解下pinyin4j,js可以了解ChinesePY.js 获取拼音的意义多在 ...

  3. Excel中如何获取汉字拼音首字母

    Excel中如何获取汉字拼音首字母 在工作中,为了方便查询.排序或者编码,需要生成汉字内容信息的首字母,如果信息很多的话,一个个录入是一件很麻烦的事情,下面给大家介绍一个便捷的方法,轻松获取汉字拼音首 ...

  4. sqlserver 获取汉字拼音首字母

    sqlserver 获取汉字拼音首字母 调用方式: select dbo.fun_getPY('张三') as result 脚本: create function [dbo].[fun_getPY] ...

  5. 在Excel中如何获取汉字拼音首字母?

    转自:https://jingyan.baidu.com/article/0a52e3f43c3f6abf63ed7259.html百度经验 在Excel中如何获取汉字拼音首字母?| 在工作中,为了方 ...

  6. php获取汉字的首字母,php获取汉字拼音首字母的方法

    现实中我们经常看到这样的说明,排名不分先后,按姓名首字母进行排序.这是中国人大多数使用的排序方法.那么在php程序中该如何操作呢? 下面就分享一下在php程序中获取汉字拼音的首字母的方法,在网上搜到的 ...

  7. iOS获取汉字拼音首字母的方法

    iOS获取汉字拼音首字母的方法 之前在项目中需要根据昵称的首字母进行排序,蹚了几个坑,今天记录一下.其实iOS系统封装的就有获取汉字首字母的方法,但不推荐,想看最优解的同学直接略过: var name ...

  8. php获取拼音首字母排序,PHP获取汉字拼音首字母的方法

    PHP获取汉字拼音首字母的方法: function getfirstchar($s0){ $fchar = ord($s0{0}); if($fchar >= ord("A" ...

  9. 在delphi 7中实现获取汉字拼音首字母

    公司的餐饮系统出品的助记码,还没实现自动从出品名称获取汉字拼音首字母. 所以在网上找了三种解决方法, 一种是kaguo 的使用常用汉字拼音查找方法,这种代码十分简单,实现方便,但是这种代码仅仅是一级字 ...

  10. C# 获取汉字拼音首字母

    最近悟出来一个道理,在这儿分享给大家:学历代表你的过去,能力代表你的现在,学习代表你的将来. 十年河东十年河西,莫欺少年穷 学无止境,精益求精   本节探讨C#获取汉字拼音首字母的方法: 代码类东西, ...

最新文章

  1. C++ const与define
  2. 【Network Security!】用户组管理与批处理中(:goto)的用法
  3. 卷积神经网络(CNN)新手指南 1
  4. javascript字典中添加数组_如何在 JavaScript 中更好地使用数组
  5. 在linux下 用户的密码错误,linux – 常规用户帐户之间的su失败,“su:密码错误”...
  6. 解决Mac装上Jetbrain系列软件(Pycharm/Idea)破解包无效导致软件启动报错
  7. Struts2学习(二):第一个Action
  8. windows 64位sed.exe_32位,64位,x86,x64到底是什么关系?差距居然这么大
  9. AI_机器学习与深度学习有什么区别?
  10. Java调用webservice
  11. 四十五、 Redis云平台CacheCloud搭建之二进制文件
  12. 思科FTP服务器如何传输文件,与FXP配置示例的ASA文件传输
  13. 6个超炫酷的HTML5电子书翻页动画
  14. 十一.TensorFlow之可视化好帮手B
  15. 基本软件开发模型:瀑布模型、V型模型、迭代模型、增量模型、螺旋模型、大爆炸模型、敏捷模型、原型模型、W模型 特点分析与总结
  16. 基于数据库实现微服务动态路由
  17. 基于C++的数据结构-1
  18. Echarts制作横向坐标轴,并且文字名称和数值都在横向坐标轴的上面
  19. SPA、MPA 的优缺点
  20. 网页抓取及信息提取(三)

热门文章

  1. alipay.trade.refund(统一收单交易退款接口)
  2. 做了一个iGoogle新闻Gardget
  3. HTML5制作诗歌锦集,轻叩诗歌的大门作文锦集6篇
  4. 微博奥运营销策略复盘,探索双十一微博品牌营销新手法!!
  5. matlab绘制二元二次曲线图,MAtlab 做出二元二次方程的曲线
  6. IDEA 配置文件位置
  7. Sharding-JDBC分布式事务总结(四)之BASE事务(Seat框架中——AT模式的介绍以及理解)
  8. Python爬取新笔趣阁小说
  9. 凤姐的原创诗歌 思想的悲哀
  10. Testlink开启图片上传功能