免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1618 | 回复: 0
打印 上一主题 下一主题

关于UTF8,UTF16,UTF32,UTF16-LE,UTF16-BE (ZZ) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-27 17:12 |只看该作者 |倒序浏览
转自:
http://hi.baidu.com/_%E2d_%B7%B3_%DE%B2%C2%D2/blog/item/80ac6b4ed1b7cec1d0c86a3e.html

Unicode是Unicode.org制定的编码标准,目前得到了绝大部分操作系统和编程语言的支持。Unicode.org官方对Unicode的定义是:Unicode provides a unique number for everycharacter。可见,Unicode所做的是为每个字符定义了一个相应的数字表示。比如,“a“的Unicode值是0x0061, “一”的Unicde值是0x4E00,这是最简单的情况,每个字符用2个字节表示。
       Unicode.org定义了百万个以上的字符,如果将所有的字符用统一的格式表示,需要的是4个字节。“a“的Unicode表示就会变成 0x00000061,而“一“的Unicode值是0x00004E00。实际上,这就是UTF32,Linux操作系统上所使用的Unicode方案。
       但是,仔细分析可以发现,其实绝大部分字符只使用2个字节就可以表示了。英文的Unicode范围是0x0000-0x007F,中文的Unicode范围是0x4E00-0x9F**,真正需要扩展到4个字节来表示的字符少之又少,所以有些系统直接使用2个字节来表示Unicode。比如Windows 系统上,Unicode就是两个字节的。对于那些需要4个字节才能表示的字符,使用一种代理的手法来扩展(其实就是在低两个字节上做一个标记,表示这是一个代理,需要连接上随后的两个字节,才能组成一个字符)。这样的好处是大量的节约了存取空间,也提高了处理的速度。这种Unicode表示方法就是 UTF16。一般在Windows平台上,提到Unicode,那就是指UTF16了。
      
       至于UTF16-LE和UTF16-BE,与计算机的CPU构架有关。LE指Little Endian,而BE指BigEndian。关于这方面的信息,网上有很多相关的帖子。我们一般的X86系统都是LittleEndian的,可以认为 UTF16=UTF16-LE.
       由于对于欧洲和北美,实际上使用的编码范围在0x0000-0x00FF之间,只需要一个字符就可以表示所有的字符。即使是使用UTF16来作为内存的存取方式,还是会带来巨大的空间浪费,因此就有了UTF8的编码方式。这是一种很灵活的编码,对于只需要1个字节的字符,就使用一个字节,对于中日韩等原本需要两个字节才能表示的字符,则通过一个UTF16-UTF8的算法实现相互之间的转换(一般需要3个字节才能表示),而对于需要4个字节才能表示的字符,UTF8可以扩展到6个字节每个字符。UTF8使用的算法很有意思,大致映射关系如下:
       UTF-32                                  UTF8
      0x00000000 - 0x0000007F       0xxxxxxx
      0x00000080 - 0x000007FF           110xxxxx 10xxxxxx
      0x00000800 - 0x0000FFFF       1110xxxx 10xxxxxx 10xxxxxx
      0x00010000 - 0x001FFFFF       11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
      0x00200000 - 0x03FFFFFF       111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
      0x04000000 - 0x7FFFFFFF       1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
       可以发现这和IP的分址算法很是相像。
       由于UTF8可以方便的转换为UTF16和UTF32(不需要码表,转换算法可以在Unicode.org上找到C代码)。而且UTF8在每个操作系统平台上的实现都是一样的,也不存在跨平台的问题,所以UTF8成为跨平台的Unicode很好的解决方案。当然,对于中文来说,由于每个字符需要3个字节才能表示,还是有点浪费的。


本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/55468/showart_2162364.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP