必威体育Betway必威体育官网
当前位置:首页 > IT技术

Unicode 编码理解

时间:2019-09-28 01:45:33来源:IT技术作者:seo实验室小编阅读:69次「手机版」
 

unicode编码

unicode(统一码、万国码、单一码)于1990年开始研发,1994年正式公布,是计算机领域里一项业界标准,包括字符集,编码方案等。Unicode是为了解决传统字符编码方案的局限而产生的,为每种语言中的每个字符都设定了统一唯一的二进制编码,以实现跨语言、跨平台进行文本转换、处理的要求。

   计算机在设计时采用8个比特(bit)作为一个字节(byte),所以一个字节最多能表示256个字符,早期对于使用英文的西方国家来说,一个字节可以存储大小写英文字母、数学和一些符号,因此使用一个字节来制作码表(ASCII)。后来计算机传到了其他的国家,很多国家都是使用自己的语言,比如中文、日文、韩文…语言复杂了,为了解决这个问题,每个国家制定自己的码表,中国在1980年便制定了gb2312汉字编码字符集,汉字比英文多很多,一个字节明显不够用,所有就使用2个字节来编码。然而不同国家所定义的字符编码虽然可以使用,但是在不同的国家间却经常出现不兼容的情况。如果电脑想处理多语言环境(使用中文或其他语言)可能存在无法同时支持多语言环境。

   为了统一所有文字的编码,产生了Unicode,把所有语言的都统一到一套编码里,这样就不会乱码了。

在表示Unicode字符时,通常会用U+然后紧跟一组16进制的数字表示一个字符,在基本多文种平面(第零平面)Basic MultilingualPlane(BMP)里所有的字符都使用4位16进制表示。编码从U+0000到U+FFFF,共支持6万多个字符,在BMP以外的字符则需要使用5位或者6位16进制来表示。

   目前Unicode字符分为17组编排,0x0000至0x10FFFF,每组称为平面(Plane),每个面拥有65536个码位,共1114112个。

   Unicode就像一张表,包所有的字符都编写到表中,每一个字符对应一个数字,称为码点(code point),这个数字一般不直接使用,通过不同的编码方式来使用。

UTF-8、UTF-16、UTF-32就是将数字转换到程序数据的编码方案。UTF是“UnicodeTransformation Format”的缩写,可以翻译成Unicode字符集转换格式,即怎样将Unicode定义的数字转换成程序数据。

UTF-8

   UTF-8是以字节位单位对Unicode编码,第0-127位字符使用1个字节来表示,和ASCII编码相同,从128号开始的字符使用2、3、4位字节来表,UTF-8又被称为可变长编码。

   UTF-8编码中,使用的是变成的字节序列表示字符,字符对应的代码点(code point)可能使用的是1-4个字节,这样一个字节就是一个代码单元。一个代码点(code point)可能由1-4个代码单元(code unit)组成。

十进制

Unicode编码

UTF-8字节流

0-127位

0x000000-0x00007F

0xxxxxxx(7位)

128-2047位

0x000080-0x0007FF

110xxxxx 10xxxxxx(11位)

2048-65535位

0x000800-0x00FFFF

1110xxxx 10xxxxxx 10xxxxxx(16位)

65536-1114111位

0x010000-0x10FFFF

11110xxx 10xxxxxx 10xxxxxx 10xxxxxx(21位)

    比如:“汉”在Unicode中的编码为0x6C49,在表格中的第三行,使用模板为:1110xxxx 10xxxxxx10xxxxxx。将0x6C49转换成二进制:0110 1100 0100 1001,将模板中的x依次替换11100110 10110001 10001001,即E6 B1 89。

   UTF-16

UTF-16也是可变长度编码,使用2个或者4个字节来存储字符,但是会浪费存储空间

   UTF-16编码中,字符对应的代码点(code point)可能使用的是2或4个字节,因此2个字节就是一个代码单元(code unit),一个代码点(codepoint)可由1个或者2个代码单元(code unit)组成。

十进制

Unicode编码

UTF-16字节流

0-65535位

0x000000-0x00FFFF

xxxxxxxx xxxxxxxx(16位)

65536-1114111位

0x010000-0x10FFFF

110110yy yyyyyyyy 110111xx xxxxxxxx(20位)

平面0有一个专用区:0xE000-0xF8FF,有6400个码位。平面0的0xD800-0xDFFF,共2048个码位,是一个被称作代理区(Surrogate)的特殊区域。代理区的目的用两个UTF-16字符表示BMP以外的字符。所有大于0x00FFFF的码需要使用代理区的码点。

为了将一个16位无符号整数的UTF-16编码与二个16位无符号整数的UTF-16编码区分开来,Unicode编码的设计者将0xD800-0xDFFF保留下来,并称为代理区(Surrogate):

十进制

Unicode编码

说明

说明

55296-56191

0xD800-0xDB7F(896个)

High Surrogates

高位替代

56192-56913

0xDB80-0xDBFF(128个)

High Private Use Surrogates

高位专用替代

56320-57343

0xDC00-0xDFFF(1024个)

Low Surrogates

低位替代

    增补的16个平面(第2平面-第17平面),范围为:0x010000-0x10FFFF,需要使用2个代理码元表示,第一个码元为0xD800-0xDBFF(高位)范围是:11011000 00000000到11011011 11111111,第二个码元为0xDC00-0xDFFF(低位)范围是:11011100 00000000到11011111 11111111。

目前Unicode最大的码位是0x10FFFF,减去0x010000后最大值为0xFFFFF,完全可以用20位来表示。

把Unicode编码记作U,如果U≥0x10000,我们先计算U'=U-0x10000,然后将U'写成二进制形式:yyyy yyyy yyxx xxxx xxxx,U的UTF-16编码(二进制)就是:110110yyyyyyyyyy110111xxxxxxxxxx

   比如:Unicode编码0x20C30,减去0x10000后,得到0x10C30,写成二进制是:0001 0000 1100 0011 0000。用前10位依次替代模板中的y,用后10位依次替代模板中的x,就得到:1101100001000011 1101110000110000,即0xD8430xDC30。

  UTF-32

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

UTF-32编码,一个代码点对应4个字节,因此4个字节就是一个代码单元(codeunit)。

十进制

Unicode编码

UTF-32字节流

0-111411位

0x000000-0x10FFFF

xxxxxxxx xxxxxxxx xxxxxxxx xxxxxxxx (32位)

   比如:编码0x6C49使用UTF-32编码其结果为:0x00006C49。

   字节序

   字节序有两种,分别是大端(Big Endian, BE)和小段(Little Endian, LE)。根据字节序的不同,UTF-16实现为UTF-16BE和UTF-16LE,UTF-32实现为UTF-32BE和UTF-32LE。

   根据字节序的不同,UTF-16可被实现为UTF-16LE或UTF-16BE,UTF-32可被实现为UTF-32LE或UTF-32BE。

Unicode编码

UTF-16LE

UTF-16BE

UTF32-LE

UTF32-BE

0x006C49

49 6C

6C 49

49 6C 00 00

00 00 6C 49

0x020C30

43 D8 30 DC

D8 43 DC 30

30 0C 02 00

00 02 0C 30

    Unicode标准建议用BOM(Byte order Mark)来区分字节序,即在传输字节流前,先传输被作为BOM的字符“零宽无中断空格”。这个字符的编码是FEFF,而反过来的FFFE(UTF-16)和FFFE0000(UTF-32)在Unicode中都是未定义的码位,不应该出现在实际传输中。

UTF编码的BOM:

UTF编码

Byte Order Mark (BOM)

UTF-8 without BOM

UTF-8 with BOM

EF BB BF

UTF-16LE

FF FE

UTF-16BE

FE FF

UTF-32LE

FF FE 00 00

UTF-32BE

00 00 FE FF

相关阅读

淘宝助理5.2Beta 商家编码提取工具

随着淘宝网店的不断发展,一些开店必备工具升级也很快,很多点店家有点跟不上脚步了,特别是淘宝助理。今天,指导大家如何开网店的小编

urlencode编码/urldecode解码作用及使用方法

urlencode和urldecode释义urlencode是一个函数,可将字符串以URL编码,用于编码处理。URL编码(URL encoding),也称作百分号编码(Perce

全国城市区域编码

cityCode cityName provinceName 130100 石家庄市  河北省  130200 唐山市  河北省  130300 秦

词性标注词性编码表

《PFR人民日报标注语料库》词性编码表PFR语料库是对人民日报1998年上半年的纯文本语料进行了词语切分和词性标注制作而成的,严格按

关于mysql server的默认编码方式latin1

   但是我发现每次重启mysql服务,这些设置就恢复成默认的设置latin1 解决方法很简单:在mysql的配置文件my.ini写下character-set-

分享到:

栏目导航

推荐阅读

热门阅读