简体中文与繁体中文互转



一. BIG5编码, GB编码(GB2312, GBK, ...), Unicode编码, UTF编码


1.1. BIG5编码


BIG5字集是台湾繁体字集,共包括国标繁体汉字13053个


1.2. GB编码


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. 也就是说"包含"与"兼容"是两回事来的.


1.3. Unicode编码


Unicode也是一种字符编码方法, 由国际组织设计, 可以容纳全世界所有语言文字的编码方案. Unicode的学名是"UniversalMultiple-Octet Coded Character Set". 简称为UCS。UCS可以看作是"Unicode CharacterSet"的缩写.


1.4. UTF编码


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



你可能感兴趣的:(C++,互相转换,简体中文,繁体中文)