Unicode与UTF-8、UTF-16、UTF-32

Unicode

Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
起源:
因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理。最早出现的ASCII码表就是一种用来表示大小写英文字母、数字和一些符号的统一编码表。
但是,如果要表示中文、日语、韩语等,显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以需要一个统一所有文字的编码,于是Unicode应运而生。
Unicode通常用两个字节表示一个字符,原有的英文编码从单字节变成双字节,只需要把高字节全部填为0就可以。在表示一个Unicode的字符时,通常会用"U+"然后紧接着一组十六进制的数字来表示这一个字符。
作用:
Unicode能够使计算机实现跨语言跨平台的文本转换及处理。
方式:
Unicode是国际组织制定的可以容纳世界上所有文字和符号的字符编码方案。目前的Unicode字符分为17组编排,0x0000 至 0x10FFFF。UTF-8UTF-16UTF-32都是将数字转换到程序数据的编码方案

UTF-8

定义:
UTF-8以字节为单位对Unicode进行编码。
从Unicode到UTF-8的编码方式如下:

Unicode编码(十六进制) UTF-8 字节流(二进制)
000000-00007F 0xxxxxxx
000080-0007FF 110xxxxx 10xxxxxx
000800-00FFFF 1110xxxx 10xxxxxx 10xxxxxx
010000-10FFFF 11110xxx10xxxxxx10xxxxxx10xxxxxx

UTF-8的特点: 对不同范围的字符使用不同长度的编码。
对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最大长度是4个字节。从上表可以看出,4字节模板有21个x,即可以容纳21位二进制数字。Unicode的最大码位0x10FFFF也只有21位。

UTF-16

定义:
UTF-16编码以16位无符号整数为单位。
编码规则:
(U为Unicode编码)
如果U<0x10000,U的UTF-16编码就是U对应的16位无符号整数。
如果U≥0x10000,我们先计算U’=U-0x10000,然后将U’写成二进制形式:yyyy yyyy yyxx xxxx xxxx,U的UTF-16编码(二进制)就是:110110yyyyyyyyyy 110111xxxxxxxxxx。

按照上述规则,Unicode编码0x10000-0x10FFFF的UTF-16编码有两个16位无符号整数,第一个的高6位是110110,第二个的高6位是110111。可见,第一个16位无符号整数的取值范围(二进制)是11011000 00000000到11011011 11111111,即0xD800-0xDBFF。第二个16位无符号整数的取值范围(二进制)是11011100 00000000到11011111 11111111,即0xDC00-0xDFFF。为了将一个16位无符号整数的UTF-16编码与两个16位无符号整数的UTF-16编码区分开来,Unicode编码的设计者将0xD800-0xDFFF保留下来,并称为代理区。

UTF-32

定义:
UTF-32编码以32位无符号整数为单位。Unicode的UTF-32编码就是其对应的32位无符号整数。

虽然每一个码位使用固定长定的字节看似方便,它并不如其它Unicode编码使用得广泛。它更容易进行截断操作,但这方面并不比UTF-8及UTF-16强多少,因为后两者也只要在要截断的位置向前或向后至多搜索2-4个字符即可。

综上所述,UTF是Unicode的实现,它分为utf-8,utf-16,utf-32几种形式,其中utf-8和utf-16都是变长的,而utf-32是定长编码。

谢谢观看。

发布了10 篇原创文章 · 获赞 0 · 访问量 167

猜你喜欢

转载自blog.csdn.net/fanqyoo/article/details/100934133