常用编码详解
2007-07-21 21:36:06 来源:WEB开发网六、GB2312编码中汉字的确定
最早,表示汉字的区位码中,分为94个区,每个区94个汉字,1-15区是西文字符,图形等,16-5为一级汉字,56-87为二级汉字,87区以上为新字用。而我们在Windows默认的编码,GB2312(1981年国家颁布的《信息交换用汉字编码字符集基本集》)国标码,和区位码的换算为:
国标码 = 区位码 + 2020H
而在汉字在计算机内表示的时候为保证ASCII码和汉字编码的不混淆,又做了一个换算:
汉字机内码 = 国标码 + 8080H
所以,真正的在Windows上的GB2312汉字编码是机内码,从上边的两个公式可以得到的就是:
汉字机内码 = 区位码 + a0a0H
一个汉字的编码最少要a0a0H,因此我们在CString中辨别汉字的时候可以认为:当一个字符的编码大于a0的时候它应该是汉字的一个部分。但是也有特殊的情况的,不是每个汉字的两个字节编码都是大于a0H的,例如‘镕’的编码是 ‘E946’,后面的部分就不满足大于a0H的条件。
七、Windows下多字节编码和Unicode的转换
Windows提供了API函数,可以把Unicode字符数组转换为GB2312字符串。其中,Unicode数组在传入时候最后一个为0,也就是所谓的null termidated字符串。在函数内部得到要返回字节串的大小,请求空间,进行真正的转换操作,指针在外部使用后释放,或者在类中加如其他的操作来处理,比如析构函数中释放。返回值为写到字节串里数目。int StringEncode::UnicodeToGB2312(char **dest, const WCHAR *src)
{
char* buffer;
int size = ::WideCharToMultiByte(CP_ACP, 0, src, -1, NULL, 0, NULL, NULL);
// null termidated wchar''s buffer
buffer = new char[size];
int ret = ::WideCharToMultiByte(CP_ACP, NULL, src, -1, buffer, size + 1, NULL, NULL);
if (*dest != 0)
delete *dest;
*dest = buffer;
return ret;
}
更多精彩
赞助商链接