编码介绍:

ASCII

上世纪60年代,美国制定了一套字符编码,对英文字符与二进制的对应关系,做了统一规定,这被称作ASCII码。

ASCII码规定了128个字符,这128个字符只占用了一个字节的后7位,最前面的一位统一为0。

UNICODE码:

Unicode码只是一个符号集,只规定了符号的二进制码,没有规定这个二进制码在文本中如何存储。双字节编码,对ASCII码采取了高位补零的方式拓展。

UTF-8

它是一种变长的编码格式,可以使用1-4个字节表示一个符号。分为带BOM和不带BOM,带BOM的UTF-8文件是,开头三字节,EE BB EF。不带BOM的UTF-8文件,直接是内容,和ANSI的一样。

编码规则如下:

对于单字节符号,字节第一位设为0,后7位为这个符号的Unicode码,因此UTF-8编码和ASCII码是相同的。

对于n(n >1)字节符号,第一个字节前n位都设为1,

第n+1位设为0,后面字节的前两位统一设为10,剩下没有提及的二进制位,全部从后向前填充为这个符号的Unicode码。

Unicode编码(16进制)

UTF-8字节流(二进制)

000000 - 00007F

0xxxxxxx

000080 - 0007FF

110xxxxx 10xxxxxx

000800 - 00FFFF

1110xxxx 10xxxxxx 10xxxxxx

010000 - 10FFFF

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

 

GB2312

双字节高低位字节的方式存储中文。高位字节如果大于127则认为是中文字符,双字节读取;若小于127则认为是英文字符,单字节读取。不确定英文字符和ASCII码是否相同。

 

大端字节序(Big endian)和小端字节序(Little endian):

大端字节序:高字节存在低地址处,低字节存在高地址处。内存的地址是由低到高,而数据的字节却是由高到低。

小端字节序:高字节存在高地址处,低字节存在低地址处。内存的地址是由低到高,而数据的字节也是由低到高。

网络字节序是大端字节序。因为接收端要求把第一个接收到的字节当做高位字节看待,这就要求发送端发送的第一个字节是高位字节。

常见CPU字节序:

X86是小端。IBM、Sun是大端。

 

编码转换:

GBK、GB2312等与UTF8之间都必须通过Unicode编码才能相互转换:
GBK、GB2312->Unicode->UTF8
UTF8->Unicode->GBK、GB2312

 

项目中:

VS工程属性如果设置了字符集为Unicode,断点能看到wchar_t保存的中文字符不是乱码;如果设置了字符集为多字节,wchar_t中的中文是乱码。