有几个概念需要先搞清楚。
1.字符集:能够表示所有字符的集合。其中每一个字符都在字符集中有唯一的位置(即码位也称字符码)。
2.字符编码:一种具体的编码方式,用来对字符码进行存储(即二进制的实际表现)。
虽然一种字符集的字符码是唯一的,但是,由于计算机存储数据通常以字节为单位,而且出于兼容ASCII码,节省存储空间的原因。通常会有多种编码方案,来对字符码进行编码。
比如unicode字符集,就有utf-8,utf-16,utf-32三种编码方案。
3.内码:字符在内存中的二进制表示,在windows上,以''包括的字符,内码是ANSI编码的二进制;以L''包括的字符,内码是字符在Unicode中的字符码。
4.根据不同编码方案,得到的二进制字节流,会分为ASCII编码的单字节字符(串)、ANSI和UTF-8编码的多字节字符(串)、UTF-16编码的宽字节字符(串)。
单字节与多字节的编码单位都是一个字节,所以不用考虑字节序的问题,宽字节的编码单位是2个字节,所以要考虑大小端的问题。
eg:‘永’这个字的字符码是6C38(10进制为27704,也就是说,用这个字是unicode字符集中的第27704个字符),但是在不同的编码方案下,二进制是不同的。
utf-8 E6B0B8 (二进制1111 0110 1011 0000 1011 1000) 3个字节(多字节)
utf-16 6C38 (二进制0110 1100 0011 1000) 2个字节(宽字节)
utf-32 00006C38 (二进制0000 0000 0000 0000 0110 1100 0011 1000) 4个字节