游戏中F键NPC列表搜索,M键地图中NPC搜索以及汉字渲染字库的查询都会应用到汉字编码问题,F键,M键中根据输入的字母在汉字名称的NPC列表中进行搜索,字库渲染采用汉字的编码定位该汉字在游戏字库中的位置。本文主要阐述游戏中关于文字使用的方法
1 GB2312 编码
windows系统下汉字编码大多采用GB2312编码,GB2312标准共收录6763个汉字,其中一级汉字3755个,二级汉字3008个;同时,GB2312收录了包括拉丁字母、希腊字母、日文平假名及片假名字母、俄罗斯语西里尔字母在内的682个全形字符。 GB2312中对所收汉字进行了“分区”处理,每区含有94个汉字/符号。这种表示方式也称为区位码。
01-09区为特殊符号。
16-55区为一级汉字,按拼音排序。
56-87区为二级汉字,按部首/笔画排序。
10-15区及88-94区则未有编码。
在计算机中汉字使用双字节进行存储, 第一个字节称为“高位字节”,第二个字节称为“低位字节”。 “高位字节”使用了0xA1-0xF7(把01-87区的区号加上0xA0),“低位字节”使用了0xA1-0xFE(把01-94加上0xA0)。例如“啊”字在大多数程序中,会以0xB0A1储存。(与区位码对比:0xB0=0xA0+16,0xA1=0xA0+1)。 这样每个汉字的字符都可以通过区位码找到字库中的对应位置。
2 汉字转换为拼音
(1)首字母
GB2312中16到55区是按照拼音进行排序,如果仅仅是查找首字母则记录每个字母在区号中的分界点即可:如
static final int[] secPosValueList = {
1601, 1637, 1833, 2078, 2274, 2302, 2433, 2594, 2787, 3106, 3212, 3472,
3635, 3722, 3730, 3858, 4027, 4086, 4390, 4558, 4684, 4925, 5249, 9999};
对应:
static final char[] firstLetter = {
‘a‘, ‘b‘, ‘c‘, ‘d‘, ‘e‘, ‘f‘, ‘g‘, ‘h‘, ‘j‘, ‘k‘, ‘l‘, ‘m‘, ‘n‘, ‘o‘, ‘p‘,
‘q‘, ‘r‘, ‘s‘, ‘t‘, ‘w‘, ‘x‘, ‘y‘, ‘z‘};
(2)全拼转换
如果需要找到全部的拼音则需要一个拼音和汉字对应的数据库来记录,程序中通过查找来进行转换。例如:
string Hz2Py(int nCode) { string strValue=""; switch(nCode) { case 6325: case 6436: case 7571: case 7925: strValue="A"; break; case 6263: case 6440: case 7040: case 7208: case 7451: case 7733: case 7945: case 8616: strValue="AI"; break; case 5847: case 5991: case 6278: case 6577: case 6654: case 7281: case 7907: case 8038: case 8786: strValue="AN"; break; strValue="ANG"; break; case 5974: ........ } }
(3)区位码的获取
for (int i = 0; i < strText.length(); ) { ucHigh = (unsigned char)strText[i++]; // 获取机内码高字节 ucLow = (unsigned char)strText[i++]; // 获取机内码低字节 if (ucHigh >= 0xa0 || ucLow >= 0xa0) { nCode = (ucHigh - 0xa0) * 100 + ucLow - 0xa0; // 机内码 --> 区位码 strPinYin = Hz2Py(nCode); // 根据区位码找到对应的拼音 } }
3 汉字和英文字母的判断
汉字的高、低字节的最高位为1 ,OK ,char类型则为负数,英文字母为单字节,并且高位为0
char *pText = “啊”;
if( (pText[0] & 0x80) && (pText[1] & 0x80))
{ //中文
}