人类记忆字母、数字、汉字、符号需要记住读音或笔顺;计算机制只需要记录编号。
1.1 ASCII码
文本编码方式的基础是ASCII码,它是一个7位的编码标准,包括26个小写字母、26个大写字母、10个数字、32个符号、33个控制代码和一个空格,共128个代码。其中ASCII码是大多数常用编码的基础。
1.2 ANSI
ANSI(美国国家标准协会)通常使用 0x00~0x7f 范围的1 个字节来表示 1 个英文字符。超出此范围的使用0x80~0xFFFF来编码,即扩展的ASCII编码。在简体中文Windows操作系统中,ANSI 编码代表 GB2312编码(国标码),GBK是GB2312的扩展;在繁体中文Windows操作系统中,ANSI编码代表Big5(大五码);在日文Windows操作系统中,ANSI 编码代表 JIS 编码。
一个汉字可能同时存在于GB2312、Big5、JIS中,他们的编码不一定相同。“就”在GB2312中的编码是{ 0xbe, 0xcd },在Big5中是{ 0xb4, 0x4e }。“義”在GB2312的编码是{ 0xc1, 0x78 },在Big5中是{ 0xb8, 0x71 }。由于是先有繁体字后有简体字,所以GB2312中有许多繁体字,Big5中我暂没发现简体字。
GB2312和Big5除ASCLL码一个字节外,其它都是两个字节。GB2312,范围:0xA1A1(41377) - 0xFEFE(65278),汉字范围:0xB0A1(45217) - 0xF7FE(63486)。Big5码,“高位字节”使用了0x81-0xFE,“低位字节”使用了0x40-0x7E,及0xA1-0xFE。
1.3 Unicode
Unicode,万国码、统一码,可以同时支持多国语言。
1.3.1 实现方式
目前(2021年8月)有99089个字符,其中包括71226个汉字。2个字节最多只能表示6万多个字所以需要4位。
UTF32,所有字符都是4个字节。
UTF16大部分字符(往往是常用字符)2字节,少量4字节。Unicode标准规定U+D800..U+DFFF不对应于任何字符,所以以D8到DF开头的是4字节,否则是2字节。
UTF8理论上最多需要6个字节,目前需要1到4个字节。除首字节外,其它字节前两个二进制位一定是10。只需要1个字节时,首字节第一个二进制位一定是0;需要两个字节时,首字节前3个二进制位一定是110;需要三个字节时,首字节前4个二进制位一定是1110;需要四个字节时,首字节前5个二进制位一定是11110。1个字节有7个有效二进制位,2个字节有11个二进制位,3个字节有16个二进制位,4个字节有21个二进制位。
1.4 转换
C#利用System.Text.Encoding类转换。string、char是小端utf16编码。C++用MultiByteToWideChar和WideCharToMultiByte。gb2312和buf8是多字节(char),utf16是宽字节。VC中多字节是gb2312编码,宽字节是小端UTF16编码。测试环境:Win7+VS2012。