分享

UNICODE

 liluvu 2013-04-23

字节字符的区别:

字节一般是由8bit组成,而字符可能是由多个字节组成。特别是unicode的出现。

 

大端小端:

计算机中组成字符的各个字节的存放顺序,大端是高字节存放在低地址,低字节存放在高地址;小端则相反。

 

UCS-2UCS-4

Unicode是为整合全世界的所有语言文字而诞生的。任何文字在Unicode中都对应一个值,这个值称为代码点code point)。

UCS-2Universal Character Set coded in 2 octets,用两个字节来表示代码点,其取值范围为U+0000U+FFFF.

UCS-4则是用四个字节表示代码点,范围为U+00000000U+7FFFFFFF,其中U+00000000U+0000FFFFUCS-2是一样的。

要注意,UCS-2UCS-4只规定了代码点和文字之间的对应关系,并没有规定代码点在计算机中如何存储。规定存储方式的称为UTFUnicode Transformation Format),其中应用较多的就是UTF-16UTF-8了。

 

UTF-16UTF-32

UTF-16

UTF-16RFC2781规定,它使用两个字节来表示一个代码点。

不难猜到,UTF-16是完全对应于UCS-2的,即把UCS-2规定的代码点通过Big EndianLittle Endian方式直接保存下来。UTF-16包括三种:UTF-16UTF-16BEBig Endian),UTF-16LELittle Endian)。

UTF-16BEUTF-16LE不难理解,而UTF-16就需要通过在文件开头以名为BOMByte Order Mark)的字符来表明文件是Big Endian还是Little EndianBOMU+FEFF这个字符。

其实BOM是个小聪明的想法。由于UCS-2没有定义U+FFFE,因此只要出现 FF FE 或者 FE FF 这样的字节序列,就可以认为它是U+FEFF,并且可以判断出是Big Endian还是Little Endian

 

UTF-32

UTF-32用四个字节表示代码点,这样就可以完全表示UCS-4的所有代码点,而无需像UTF-16那样使用复杂的算法。与UTF-16类似,UTF-32也包括UTF-32UTF-32BEUTF-32LE三种编码,UTF-32也同样需要BOM字符。

UTF-8

UTF-16UTF-32的一个缺点就是它们固定使用两个或四个字节,这样在表示纯ASCII文件时会有很多00字节,造成浪费。而RFC3629定义的UTF-8则解决了这个问题。

UTF-814个字节来表示代码点。

可见,ASCII字符(U+0000U+007F)部分完全使用一个字节,避免了存储空间的浪费。而且UTF-8不再需要BOM字节。

另外,从上表中可以看出,单字节编码的第一字节为[00-7F],双字节编码的第一字节为[C2-DF],三字节编码的第一字节为[E0-EF]。这样只要看到第一个字节的范围就可以知道编码的字节数。这样也可以大大简化算法。

 

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多