字符编码相关的知识

1)字节和字符的区别

●字节和字符能有什么区别啊?不都是一样的吗?完全正确,但只是在古老的DOS时代。当Unicode出现后,字节和字符就不一样了。
●字节(octet)是一个八位的存储单元,取值范围一定是0~255。
●字符(character,或者word)为语言意义上的符号,范围就不一定了。例如在UCS-2中定义的字符范围为0~65535,它的一个字符占用两个字节。
 
2)大端和小端的问题
●字符0xabcd,在计算机中,它的存储格式到底是 AB CD,还是 CD AB 呢?
●如果存储为 AB CD,则称为Big Endian 。
●如果存储为 CD AB,则称为Little Endian。
 
3)unicode是什么
●Unicode的学名叫“Universal Multiple-Octer Coded Character Set”。
●Unicode是一种编码方式。
●任何文字在Unicode中都对应一个值,这个值称为代码点(code point)。
 
4)UCS是什么
●文字和代码点之间的对应关系就是UCS-2(Universal Character Set coded in 2 octets)。
●UCS-2是用两个字节来表示代码点,其取值范围为 U+0000~U+FFFF。
●UCS-4,即用四个字节表示代码点。它的范围为 U+00000000~U+7FFFFFFF,其中 U+00000000~U+0000FFFF和UCS-2是一样的
 
5)UTF是什么
●UCS-2和UCS-4只规定了代码点和文字之间的对应关系,并没有规定代码点在计算机中如何存储。
●规定存储方式的称为UTF(Unicode Transformation Format),其中应用较多的就是UTF-16和UTF-8了。
 
6)BOM是什么
●字节顺序记号(英:byte-order mark,BOM)是位于码点 U+FEFF 的统一码字符(“零宽度无断空白”)。当以 UTF-16 或 UTF-32 来将UCS/统一码字符所组成的字串编码时,这个字符被用来标示其字节序。它常被用来当做标示文件是以 UTF-8 、 UTF-16 或 UTF-32 编码的记号。
●不同编码的字节顺序记号的表示

  编码                              表示 (十六进制)

  UTF-8                           EF BB BF

  UTF-16(Big Endian)       FE FF

  UTF-16(Little Endian)    FF FE

  UTF-32(Big Endian)       00 00 FE FF 

  UTF-32(Little Endian)     FF FE 00 00
 
7)UTF-16
●UTF-16由RFC2781规定,它使用两个字节来表示一个代码点。
●UTF-16是完全对应于UCS-2的,即把UCS-2规定的代码点通过Big Endian或Little Endian方式直接保存下来。
●UTF-16包括三种:UTF-16,UTF-16BE(Big Endian),UTF-16LE(Little Endian)。
●比如说char 'a', ascii为0x61
        UTF-16BE表示: 0x00, 0x61
        UTF-16LE表示: 0x61, 0x00
而UTF-16就需要通过在文件开头以名为BOM(Byte Order Mark)的字符来表明文件是Big Endian还是Little Endian。
 
8)UTF-32
●UTF-32用四个字节表示代码点,这样就可以完全表示UCS-4的所有代码点,而无需像UTF-16那样使用复杂的算法。
●与UTF-16类似,UTF-32也包括UTF-32、UTF-32BE、UTF-32LE三种编码,UTF-32也同样需要BOM字符。
 
9)UTF-8
●UTF-16和UTF-32的一个缺点 :固定使用两个或四个字节,这样在表示纯ASCII文件时会有很多00字节,造成浪费。
●UTF-8用1~4个字节来表示代码点。
●从表中可以看出,单字节编码的第一字节为[00-7F],双字节编码的第一字节为[C2-DF],三字节编码的第一字节为[E0-EF]。这样只要看到第一个字节的范围就可以知道编码的字节数。
 
 
 
原文地址:https://www.cnblogs.com/honglihua8688/p/3681260.html