最近老遇到C/C++中中文汉字或符号 编码的问题,网上的大部分资料都是依赖第三方的库来解决的,这里给大家分享一个非库函数实现的编码转换补充。
接着上篇博文的GB2313的简体中文表,最后再添加上缺失的中文标点符号。
const unsigned short gb2312table[20902] ={
//补充中文标点:多了 19 个
0xa1ef,//★
0xa3ba, 0xa3ac, 0xa1a3, 0xa1a2,//冒号、逗号、句号、顿号::,。、
0xa1b6, 0xa1b7,//书名号:《》
0xa3bf, 0xa3a1,//问号、感叹号:?!
0xa1b0, 0xa1b1,//双引号:“”
0xa3a8, 0xa3a9,//括号:()
0xa3db, 0xa3dd,//中括号:【】
0xa3bb, 0xa1e6,//分号、摄氏度:
0xa3a4, 0xa1ad,//人民币、省略号半个:¥…
}
具体值可参考上篇博文GB2312简体中文附录
GB2312简体中文编码表 GB2312码是中华人民共和国国家汉字信息交换用编码,全称《信息交换用汉字编码字符集--基本集》,由国家标准总局发 布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。 GB2312收录简化汉字及符号、字母、日文假名等共7445个图形字符,其中汉字占6763个。GB2312规定"对任意一个图形字符 都采用两个字节表示,每个字节均采用七位编码表示",习惯上称第一个字节为"高字节",第二个字节为"低字节"。 GB2312-80包含了大部分常用的一、二级汉字,和9区的符号。该字符集是几乎所有的中文系统和国际化的软件都支持的中 文字符集,这也是最基本的中文字符集。其编码范围是高位0xa1-0xfe,低位也是0xa1-0xfe;汉字从0xb0a1开始,结束于 0xf7fe。
修正对应关系:
static unsigned short chinese_code(unsigned short unicode)
{
if ((unicode >= 0x4e00) && (unicode < 0x9fa6))
return (unicode - 0x4e00);
else if (unicode == 0xff1a) //冒号
return 20903;
else if (unicode == 0xff0c) //逗号
return 20904;
else if (unicode == 0x3002) //句号
return 20905;
else if (unicode == 0x3001) //顿号
return 20906;
else if (unicode == 0x300a) //《
return 20907;
else if (unicode == 0x300b) //》
return 20908;
else if (unicode == 0xff1f) //?
return 20909;
else if (unicode == 0xff01) //!
return 20910;
else if (unicode == 0x201c) //“
return 20911;
else if (unicode == 0x201d) //”
return 20912;
else if (unicode == 0xff08) //(
return 20913;
else if (unicode == 0xff09) //)
return 20914;
else if (unicode == 0x3010) //【
return 20915;
else if (unicode == 0x3011) //】
return 20916;
else if (unicode == 0xff1b) //分号
return 20917;
else if (unicode == 0x2103) //摄氏度
return 20918;
else if (unicode == 0xffe5) //人民币
return 20919;
else if (unicode == 0x2026) //省略号
return 20920;
else
return 20902;
}
修正转换函数:
static char pszBufOut[4300];
char* GBK_Format(const unsigned char* pszBufIn)
{
int i = 0;
int j = 0, nLen;
unsigned short unicode;
unsigned short gbk;
int nBufInLen = 0;
if (pszBufIn == NULL)
return NULL;
nBufInLen = strlen((char*)pszBufIn);
for(; i < nBufInLen; i++, j++)
{
if((pszBufIn[i] & 0x80) == 0x00)
{
nLen = 1;
pszBufOut[j]= pszBufIn[i];
}
else if ((pszBufIn[i] & 0xF0) == 0xE0)
{
if (i+ 2 >= nBufInLen) return NULL;
unicode = (((int)(pszBufIn[i] & 0x0F)) << 12) | (((int)(pszBufIn[i+1] & 0x3F)) << 6) | (pszBufIn[i+2] & 0x3F);
gbk = gb2312table[chinese_code(unicode )];
pszBufOut[j]= gbk/256;
pszBufOut[j+1] = gbk%256;
j++;
i+=2;
}
else
{
return NULL;
}
}
return pszBufOut;
}
最后得到如下结果: