ANSI, GB2132, Unicode, UTF-8介绍
ANSI 的"Ascii"编码使用了单字节的1~127值。
汉字是使用0xA1到0xFE之间的值,二个字节表示一个汉字。一共可显示汉字个数为(0XFE - 0XA1) * (0XFE - 0XA1) = 8649 。
如果默认非Uncoide的编码是中文简体,即使用GB2132编码。一个英文字符用一个字节,一个汉字用两个字节。
(即在非Uncoide程序中,我们对字符串操作一般都用的GB2132编码。)
为了支持多国语言,采用的Unicode编码。 每一个文字(无论是中文、日文、韩文等等)都有固定的编码,一般长度为两个字节。
(注:双字节最多可表示65536个字符,还是不够用。所以最新的Unicode采用变长的字符集。)
Uncoide不光可以显示各国的文字,还能显示各种特殊的字符。
数据类型对应:
Unicode编码 =》 w_char
非Uncoide的GB2132编码 =》 char
注意:有时候为了显示特殊字符(例如"♣"),如果指定为char*,有可能就丢失字符信息,丢失后显示为"?",这个时候必须用w_char。
相应的,对字符串操作,对API的调用都要用对应的双字节函数。
而汉字就不会存在这样的问题,即使使用char(GB2132编码)也可以正常显示。
两种数据类型转换函数:
WideCharToMultiByte
MultiByteToWideChar
ATL的转换函数:
A2W()
W2A()
注意:需要使用USES_CONVERSION 宏
.net转换
用的是Encoding类
Encoding gb2312 = Encoding.GetEncoding("GB2312");
byte[] gbkBytes = gb2312 .GetBytes(data);
string str = gb2312.GetString(gbkBytes );
Code Page Identifiers参照: http://msdn.microsoft.com/en-us/library/dd317756(VS.85).aspx
UTF-8 是Unicode 的表现形式之一,长度是1-6个字节,第一个字节的高位1的数目指明了这个utf-8的字符使用的byte数目,
在UTF-8编码集中,每个汉字使用3个字符表示。
string str = "\u67e5\u8be2 ";
str = Encoding.GetEncoding( "gb2312 ").GetString(Encoding.GetEncoding( "gb2312 ").GetBytes(str));
在net下直接跟踪就可以看到是查询2字,根本就不用编码,你如果从前台输,你在看看编出来的是什么