Unicode UTF的不同

Posted 秋风兮月

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unicode UTF的不同相关的知识,希望对你有一定的参考价值。

首先需要明白的是Unicode和UTF不是相同性质的概念。Unicode(Universal Multiple-Octet Coded Character Set)描述的是编码的值,而UTF(UCS Transfer Format)描述的是对于这种编码的值如何用字节表示来进行传输。

对于使用Unicode编码,每一个符号的编码值都是固定的,根据这个特定的编码值就会显示出该符号。但是Unicode没有规定如何对这个编码值进行解析。而UTF就是一种协议用来规定Unicode的编码是如何进行转换成字节来进行传输和解析的。

UTF-8是每次8个位传输数据,是在互联网上使用最广的一种unicode的实现方式,它的最大的一个特点是变长的编码方式,它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。当字符在ASCII码的范围时,就用一个字节表示,保留了ASCII字符一个字节的编码做为它的一部分,注意的是unicode一个中文字符占2个字节,而UTF-8一个中文字符占3个字节)。从unicode到uft-8并不是直接的对应,而是要过一些算法和规则来转换。

Unicode符号范围 | UTF-8编码方式

(十六进制)         |        (二进制)
—————————————————————–
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

计算机在需要显示字符的时候,就会将UTF-8编码的字节转换成Unicode码值,找到该码值对应的字符进行显示。

例如“汉”字的Unicode编码是6C49。6C49在0800-FFFF之间,所以肯定要用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将6C49写成二进制是:0110 110001 001001,用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。

UTF-16是每次传输16个位数据。对于小于0x10000的UCS码,UTF-16编码就等于UCS码对应的16位无符号整数。对于不小于0x10000的UCS码,定义了一个算法。不过由于实际使用的UCS2,或者UCS4的BMP必然小于0x10000,所以就目前而言,可以认为UTF-16和UCS-2基本相同。但UCS-2只是一个编码方案,UTF-16却要用于实际的传输,所以就不得不考虑字节序的问题。


UCS有两种格式:UCS-2和UCS-4。顾名思义,UCS-2就是用两个字节编码,UCS-4就是用4个字节(实际上只用了31位,最高位必须为0)编码。下面让我们做一些简单的数学游戏:

UCS-2有2^16=65536个码位,UCS-4有2^31=2147483648个码位。

UCS-4根据最高位为0的最高字节分成2^7=128个group。每个group再根据次高字节分为256个plane。每个plane根据第3个字节分为256行 (rows),每行包含256个cells。当然同一行的cells只是最后一个字节不同,其余都相同。

group 0的plane 0被称作Basic Multilingual Plane, 即BMP。或者说UCS-4中,高两个字节为0的码位被称作BMP。

将UCS-4的BMP去掉前面的两个零字节就得到了UCS-2。在UCS-2的两个字节前加上两个零字节,就得到了UCS-4的BMP。而目前的UCS-4规范中还没有任何字符被分配在BMP之外。


参考文章:ASCII、Unicode、GBK和UTF-8字符编码的区别联系  
UNICODE,GBK,UTF-8区别

以上是关于Unicode UTF的不同的主要内容,如果未能解决你的问题,请参考以下文章

细说:Unicode, UTF-8, UTF-16, UTF-32, UCS-2, UCS-4

细说:Unicode, UTF-8, UTF-16, UTF-32, UCS-2, UCS-4

unicode utf8 学习记录

细说:Unicode, UTF-8, UTF-16, UTF-32, UCS-2, UCS-4

Unicode 详解

Windows 对其 Unicode 数据类型使用啥 Unicode 编码(UTF-8、UTF-16 等)?