编码介绍:
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中的中文是乱码。