字节字符的区别: 字节一般是由8bit组成,而字符可能是由多个字节组成。特别是unicode的出现。 大端小端: 计算机中组成字符的各个字节的存放顺序,大端是高字节存放在低地址,低字节存放在高地址;小端则相反。 UCS-2和UCS-4: Unicode是为整合全世界的所有语言文字而诞生的。任何文字在Unicode中都对应一个值,这个值称为代码点(code point)。 UCS-2(Universal Character Set coded in 2 octets),用两个字节来表示代码点,其取值范围为U+0000~U+FFFF. UCS-4则是用四个字节表示代码点,范围为U+00000000~U+7FFFFFFF,其中U+00000000~U+0000FFFF和UCS-2是一样的。 要注意,UCS-2和UCS-4只规定了代码点和文字之间的对应关系,并没有规定代码点在计算机中如何存储。规定存储方式的称为UTF(Unicode Transformation Format),其中应用较多的就是UTF-16和UTF-8了。 UTF-16和UTF-32UTF-16UTF-16由RFC2781规定,它使用两个字节来表示一个代码点。 不难猜到,UTF-16是完全对应于UCS-2的,即把UCS-2规定的代码点通过Big Endian或Little Endian方式直接保存下来。UTF-16包括三种:UTF-16,UTF-16BE(Big Endian),UTF-16LE(Little Endian)。 UTF-16BE和UTF-16LE不难理解,而UTF-16就需要通过在文件开头以名为BOM(Byte Order Mark)的字符来表明文件是Big Endian还是Little Endian。BOM为U+FEFF这个字符。 其实BOM是个小聪明的想法。由于UCS-2没有定义U+FFFE,因此只要出现 FF FE 或者 FE FF 这样的字节序列,就可以认为它是U+FEFF,并且可以判断出是Big Endian还是Little Endian。 UTF-32UTF-32用四个字节表示代码点,这样就可以完全表示UCS-4的所有代码点,而无需像UTF-16那样使用复杂的算法。与UTF-16类似,UTF-32也包括UTF-32、UTF-32BE、UTF-32LE三种编码,UTF-32也同样需要BOM字符。 UTF-8UTF-16和UTF-32的一个缺点就是它们固定使用两个或四个字节,这样在表示纯ASCII文件时会有很多00字节,造成浪费。而RFC3629定义的UTF-8则解决了这个问题。 UTF-8用1~4个字节来表示代码点。 可见,ASCII字符(U+0000~U+ 另外,从上表中可以看出,单字节编码的第一字节为[00-7F],双字节编码的第一字节为[C2-DF],三字节编码的第一字节为[E0-EF]。这样只要看到第一个字节的范围就可以知道编码的字节数。这样也可以大大简化算法。 |
|
来自: liluvu > 《Book note》