问题
碰到这样的需求,给定一个中文字符,如”中”,获取其拼音表示,如:zhong。
思路
在Unicode开发环境下,每一个字符,不论它是中文字符,还是ASCII字符,都是用两个字节表示。例如:
TCHAR ch1 = _T(‘A’);
这里的ch1的大小是两个字节,ch1的值为0x0041。
TCHAR ch2 = _T(‘中’);
这里的ch2的大小是也是两个字节,ch1的值为0x4E2D。
想要得到汉字的拼音,必须先得到汉字对应的GB2312/GBK机内码。这里需要注意的是,Unicode字符集和GB2312/GBK字符集是两套互不兼容的字符编码标准,比如”中”字的Unicode编码为0x4E2D,而它的GB2312/GBK编码为0xD6D0。
得到汉字对应的GB2312/GBK机内码之后,可以通过查询GB2312/GBK标准来得到其对应的拼音了。
实现方法
1) 通过WideCharToMultiByte将Unicode字符集转换为ANSI字符集。
2) 判断转换的ANSI字符是否是ASCII字符,可以使用isascii函数来进行判断。
3) 如果转换的ANSI字符的高低字节都大于0xA0,则表示这是一个中文字符,可以通过如下的公式获取其GB2312/GBK机内码。
chHigh = 高8位字节(中文字符);
chLow = 低8位字节(中文字符);
GBK = (chHigh – 0xA0) * 100 + chLow – 0xA0;
4) 根据GB2312/GBK表查询对应的拼音表示。
总结
对于没有对应关系的两个字符集Unicode和GB2312/GBK来说,也只能通过查表的方式找出对应关系了。
![7b0a17a0448c0fa71fe1f16cfeffae9c.png](https://i-blog.csdnimg.cn/blog_migrate/9422436ff2d89701a3b446d0609761d4.jpeg)