BIG5字集是台湾繁体字集,共包括国标繁体汉字13053个
GB2312字集是简体字集, 全称为GB2312(80)字集, 共包括国标简体汉字6763个;
GB2312是中国规定的汉字编码, 也可以说是简体中文的字符集编码;
GBK包含全部中文字符;
GBK字集是简繁字集, 包括了GB的字集, BIG5的字集和一些符号, 共包括21003个字符;
GBK是GB2312的扩展, 除了兼容GB2312外, 它还能显示繁体中文, 还有日文的假名;
GBK标准, 他兼容GB2312标准, 同时在GB2312标准的基础上扩展了GB13000包含的字;
注意:
1. GBK字集是简繁字集, 包括了GB字集, BIG5字集和一些符号; 例如BIG5编码能够表示XX汉字, GBK编码也能够表示XX汉字, 但是XX汉字的BIG5编码与GBK编码是不同的.
2. GBK编码兼容GB2312编码, 例如GB2312编码能够表示YY汉字, 那么GBK编码也能够表示YY汉字, 而且YY汉字的GB2312编码与GBK编码是相同的.
3. 也就是说"包含"与"兼容"是两回事来的.
Unicode也是一种字符编码方法, 由国际组织设计, 可以容纳全世界所有语言文字的编码方案. Unicode的学名是"UniversalMultiple-Octet Coded Character Set". 简称为UCS。UCS可以看作是"Unicode CharacterSet"的缩写.
UTF编码是对Unicode编码的存储(传输)规则(不是对文字的编码规则).
1. 简体中文是使用GB2312编码的; 台湾繁体中文使用BIG5编码; 而GBK编码既包含简体中文, 也包含了繁体中文;
2. 所以, 要表示简体中文, 你可以使用GB2312编码和GBK编码; 要表示繁体中文, 你可以使用BIG5编码和GBK编码;
3. 通常, 如果在简体中文操作系统中使用的繁体字, 选GBK码繁体中文; 如果在繁体中文操作系统使用繁体字, 选BIG5码繁体中文;
我自己使用Window系统就是使用GBK编码简体中文系统.
例子: char* p = "你好, 中国";
1. 这里就是使用GBK编码简体部分(就是GB2312编码)(本地操作系统的编码);
2. 如果"你好, 中国"转换成繁体, 你需要使用GBK编码的繁体部分或者使用BIG5编码;
1. 简体中文可以用哪些编码实现: GBK编码简体部分, Unicode编码简体部分, GB2312编码;
2. 繁体中文可以用哪些编码实现: GBK编码繁体部分, Unicode编码繁体部分, BIG5编码;
3. 所以繁简中文互换有这些途径(GBK编码简体部分和GB2312编码可以认为是同一个东西):
a. GBK编码简体部分<->GBK编码繁体部分 b. GBK编码简体部分<->Unicode编码繁体部分 c. GBK编码简体部分<->BIG5编码 d. Unicode编码简体部分<->GBK编码繁体部分 e. Unicode编码简体部分<->Unicode编码繁体部分 f. Unicode编码简体部分<->BIG5编码4. 其中编码实现时, "GBK编码<->BIG5编码"需要这样子(通过Unicode作为中间人): GBK编码<->Unicode编码<->BIG5编码, 所以有:
A. GBK编码简体部分<->GBK编码繁体部分 变成: GBK编码简体部分<--LCMapStringA-->GBK编码繁体部分 B. GBK编码简体部分<->Unicode编码繁体部分 变成: GBK编码简体部分<--LCMapStringA-->GBK编码繁体部分<->Unicode编码繁体部分 C. GBK编码简体部分<->BIG5编码 变成: GBK编码简体部分<--LCMapStringA-->GBK编码繁体部分<->Unicode编码繁体部分<->BIG5编码 D. Unicode编码简体部分<->GBK编码繁体部分 变成: Unicode编码简体部分<->GBK编码简体部分<--LCMapStringA-->GBK编码繁体部分 E. Unicode编码简体部分<->Unicode编码繁体部分 变成: Unicode编码简体部分<->GBK编码简体部分<--LCMapStringA-->GBK编码繁体部分<->Unicode编码繁体部分 F. Unicode编码简体部分<->BIG5编码 变成: Unicode编码简体部分<->GBK编码简体部分<--LCMapStringA-->GBK编码繁体部分<->Unicode编码繁体部分<->BIG5编码
5. 简化一下: 因为GBK包含了简体中文和繁体中文, 所以只使用A. GBK编码简体部分<->GBK编码繁体部分, 然后其他的编码方式, 喜欢怎么转就怎么转.
参考: http://blog.csdn.net/bagboy_taobao_com/article/details/8594466
// #define LCMAP_SIMPLIFIED_CHINESE 0x02000000 // map traditional chinese to simplified chinese // #define LCMAP_TRADITIONAL_CHINESE 0x04000000 // map simplified chinese to traditional chinese char* TSTransform(const char* pStrSrc, int nToTS) { LCID lcid = MAKELCID(MAKELANGID(LANG_CHINESE,SUBLANG_CHINESE_SIMPLIFIED),SORT_CHINESE_PRC); int nLength = LCMapStringA(lcid, nToTS, pStrSrc, -1, NULL, 0); char* pBuffer = new char[nLength + 1]; memset(pBuffer, 0, nLength + 1); LCMapStringA(lcid, nToTS, pStrSrc, -1, pBuffer, nLength); // 繁体转简体 return pBuffer; } // 繁体中文转换成简体中文(基于GBK编码) char* TraditionalToSimplified(const char* pStrTraditional) { return TSTransform(pStrTraditional, LCMAP_SIMPLIFIED_CHINESE); } // 简体中文转换成繁体中文(基于GBK编码) char* SimplifiedToTraditional(const char* pStrSimplified) { return TSTransform(pStrSimplified, LCMAP_TRADITIONAL_CHINESE); } int _tmain(int argc, _TCHAR* argv[]) { std::string strGB2312 = "你好, 中国!"; char* pS = SimplifiedToTraditional(strGB2312.c_str()); char* pT = TraditionalToSimplified(pS); return 0; }
文档说明:
http://msdn.microsoft.com/en-us/library/cc233968.aspx
http://msdn.microsoft.com/en-us/library/dd318700(VS.85).aspx
另看:
编码了解: http://blog.csdn.net/bagboy_taobao_com/article/details/42294097
编码转换实现代码: http://blog.csdn.net/bagboy_taobao_com/article/details/8594466