Unicode学习笔记

来源:互联网 发布:腾讯qq软件管理 编辑:程序博客网 时间:2024/05/21 06:32

什么是Unicode

由于计算机只能对数字进行处理,当储存字符的时候,其实在计算机内部存储的依然是数字,只不过这些数字每一个都对应了一个字符,这样就是对字符进行了一次编码。

在Unicode编码出现之前,就有许多不同的字符编码,这些字符编码中每个字符与数字的对应关系都不尽相同。因此:

  1. 一个同样的数字在不同的字符编码中就可能表示着不同的字符,或者相同的字符在不同的字符编码中对应着不同的数字,在使用不同字符编码的平台间传递数据的话,最终得到的字符可能与原始字符完全不同。因此不同的字符编码之间是存在冲突的。
  2. 这些字符编码通常都有着特定的使用环境,比如A字符编码是用于对英文字符进行编码的,而B字符编码是对俄语字符进行编码的,这样就导致每个字符编码都不能表示世界上所有可能用到的字符。

为了解决这些问题,有两拨人行动了起来——这两拨人一拨是Unicode组织,另一拨是ISO-10646工作小组——创造了Unicode编码,也叫万国码、国际码、统一码。

Unicode为世界上的每一个字符对应上了一个唯一的数字(好吧我夸张了一些,Unicode现在还在不断地向其中添加新的字符)。

Unicode的编码与实现

Unicode的编码

目前实际使用的Unicode版本使用16位编码空间,也就是每个字符使用2个字节来表示,这样理论上一共最多可以表示216(即65536)个字符,基本满足各种语言的使用。实际上当前版本的Unicode并未完全使用这16位编码空间,而是保留了大量空间以作为特殊使用或将来扩展。这些16位Unicode字符构成了基本多文种平面。基本多文种平面的字符的编码为U+hhhh,其中每个h代表一个十六进制数字。

最新(但未实际广泛使用)的统一码版本定义了16个辅助平面,加上基本多文种平面,一共是17种平面,为了表示这17个平面中的所有字符,就需要 16 + 5 = 21 位编码空间,比三个字节少一点点,但是辅助平面字符仍然占用4字节编码空间。

Unicode的实现方式

Unicode的实现方式不同于编码方式。一个字符的Unicode编码是确定的,但是在实际传输过程中,由于不同系统平台的设计不一致,以及出于节省空间的目的,对Unicode编码的实现方式有所不同。

Unicode的实现方式称为Unicode转换格式(Unicode Transformation Format,简称为UTF)。Unicode常见的实现方式有UTF-8(在互联网上使用最广的一种Unicode的实现方式)、UTF-16和UTF-32,他们之间的关系就是,他们都是Unicode的一种实现方式。

UTF-8

UTF-8是在互联网上使用最广的一种Unicode的实现方式。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码,互联网邮件联盟(IMC)建议所有电子邮件软件都支持UTF-8编码。

UTF-8是一种针对Unicode的可变长度字符编码,它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

UTF-8的编码规则很简单,只有两条:

  1. 对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。
  2. 对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

    下表总结了编码规则,字母x表示可用编码的位。

    Unicode符号范围(16进制) UTF-8编码方式(2进制) 0000 0000-0000 007F 0xxxxxxx 0000 0080-0000 07FF 110xxxxx 10xxxxxx 0000 0800-0000 FFFF 1110xxxx 10xxxxxx 10xxxxxx 0001 0000-0010 FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

那么问题来了,如何判断一个字符用几个字节表示呢?(规则好难记 ToT)

  1. 128个US-ASCII字符只需一个字节编码(Unicode范围由U+0000至U+007F)。
  2. 带有附加符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文及它拿字母则需要两个字节编码(Unicode范围由U+0080至U+07FF)。
  3. 其他基本多文种平面(BMP)中的字符(这包含了大部分常用字,如大部分的汉字)使用三个字节编码(Unicode范围由U+0800至U+FFFF)。
  4. 其他极少使用的 Unicode 辅助平面的字符使用四字节编码。

但UTF-8对所有常用的字符都可以用三个字节表示。

参考资料:

  1. 字符编码笔记:ASCII,Unicode和UTF-8

  2. Unicode-维基百科

  3. UTF-8-维基百科

  4. What is Unicode?
0 0
原创粉丝点击