UTF-8

UTF-8

针对Unicode的可变长度字符编码
UTF-8(8位元,Universal Character Set/Unicode Transformation Format)是针对Unicode的一种可变长度字符编码。它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与ASCII相容,使得原来处理ASCII字符的软件无须或只进行少部分修改后,便可继续使用。因此,它逐渐成为电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。
  • 中文名:UTF-8
  • 外文名:UTF-8,a transformation format of ISO 10646
  • 别名:
  • 创建时间:1992年
  • 定义:针对Unicode的可变长度字符编码
  • 所属领域:计算机科学技术

发展历程

在所有字符集中,最知名的可能要数被称为ASCII的8位字符集了。它是美国标准信息交换代码(American Standard Code for Information Interchange)的缩写为美国英语通信所设计。它由128个字符组成,包括大小写字母、数字0-9、标点符号、非打印字符(换行符、制表符等4个)以及控制字符(退格、响铃等)组成。

但是,由于它是针对英语设计的,当处理带有音调标号(形如汉语的拼音)的亚洲文字时就会出现问题。因此,创建出了一些包括256个字符的由ASCII扩展的字符集。其中有一种通常被称为IBM字符集,它把值为128-255之间的字符用于画图和画线,以及一些特殊的欧洲字符。另一种8位字符集是ISO8859-1Latin1,也简称为ISOLatin-1。它把位于128-255之间的字符用于拉丁字母表中特殊语言字符的编码,也因此而得名。欧洲语言不是地球上的唯一语言,因此亚洲和非洲语言并不能被8位字符集所支持。仅汉语字母表(或pictograms)就有80000以上个字符。但是把汉语、日语和越南语的一些相似的字符结合起来,在不同的语言里,使不同的字符代表不同的字,这样只用2个字节就可以编码地球上几乎所有地区的文字。因此,创建了UNICODE编码。它通过增加一个高字节对ISO Latin-1字符集进行扩展,当这些高字节位为0时,低字节就是ISO Latin-1字符。UNICODE支持欧洲、非洲、中东、亚洲(包括统一标准的东亚象形汉字和韩国表音文字)。但是,UNICODE并没有提供对诸如Braille(盲文),Cherokee,,Ethiopic(埃塞俄比亚语),Khmer(高棉语),Mongolian(蒙古语),Hmong(苗语),Tai Lu,Tai Mau文字的支持。同时它也不支持如Ahom(阿霍姆语),Akkadian(阿卡德语),Aramaic(阿拉米语),Babylonian Cuneiform(古巴比伦楔形文字),Balti(巴尔蒂语), Brahmi(婆罗米文),Etruscan(伊特拉斯坎语),Hittite(赫梯语/西台语),Javanese(爪哇语),Numidian(),Old Persian Cuneiform(古波斯楔形文字),Syrian(叙利亚语)之类的古老文字。

Unicode只是一组字符设定或者说是从数字和字符之间的逻辑映射的概念编码,但是它并没有指定代码点如何在计算机上存储。UCS4、UTF-8、UTF-16(UTF后的数字代表编码的最小单位,如UTF-8表示最小单位1字节(=8bits)所以它可以使用1、2、3字节等进行编码,UTF-16表示最小单位2字节,所以它可以使用2、4字节进行编码)都是Unicode的编码方案。其中UTF-8因可以兼容ASCII而被广泛使用。

基本特征

UCS字符U+0000到U+007F(ASCII)被编码为字节0×00到0x7F(ASCIⅡ兼容)。这意味着只包含7位ASCIl字符的文件在ASCIⅡ和UTF-8两种编码方式下是一样的。

所有大于0x007F的UCS字符被编码为一个有多个字节的串,每个字节都有标记位集。因此,ASCIl字节(0x00-0x7F)不可能作为任何其他字符的一部分。表示非ASCIl字符的多字节串的第一个字节总是在0xC0到0XFD的范围里,并指出这个字符包含多少个字节。多字节串的其余字节都在0x80到0xBF范围里。这使得重新同步非常容易,并使编码无国界,且很少受丢失字节的影响。

UTF-8编码字符理论上可以最多到4个字节长,然而16位BMP字符最多只用到3字节长,Bigendian UCS-4字节串的排列顺序是预定的,字节0xFE和OxFF在UTF-8编码中从未用到。

编码字节数

UTF-8使用1~4字节为每个字符编码:

·一个US-ASCIl字符只需1字节编码(Unicode范围由U+0000~U+007F)。

·带有变音符号的拉丁文、希腊文、西里尔字母、亚美尼亚语、希伯来文、阿拉伯文、叙利亚文等字母则需要2字节编码(Unicode范围由U+0080~U+07FF)。

其他语言的字符(包括中日韩文字、东南亚文字、中东文字等)包含了大部分常用字,使用3字节编码。

其他极少使用的语言字符使用4字节编码。

字符集

UTF-8编码规则:如果只有一个字节则取值为x00-x7F。其余字节按长度进行以下拓展:

UTF-8由4种编码方式实现,即UTF8-1/UTF8-2/UTF8-3/UTF8-4。其中:

UTF8-1

x00-x7F

UTF8-2

xC2-xDFx80-xBF

UTF8-3

xE0xA0-xBFx80-xBF

xE1-xECx80-xBFx80-xBF

xEDx80-x9Fx80-xBF

xEE-xEFx80-xBFx80-xBF

UTF8-4

xF0x90-xBFx80-xBFx80-xBF

xF1-xF3x80-xBFx80-xBFx80-xBF

xF4x80-x8Fx80-xBFx80-xBF

UTF816进制编码表

注:每种编码可能有多个编码范围,每个编码范围间,以空格作为每个字节的分隔符。例如UTF8-3的第一个编码,其第一个字节取值必须为xE0,第二个字节范围为xA0-xBF,第三个字节为x80-xBF。

优缺点

优点

UTF-8编码可以通过屏蔽位和移位操作快速读写。字符串比较时(strcmp)和(wcscmp)的返回结果相同,因此使排序变得更加容易。字节FF和FE在UTF-8编码中永远不会出现,因此他们可以用来表明UTF-16或UTF-32文本(见BOM)UTF-8是字节顺序无关的。它的字节顺序在所有系统中都是一样的,因此它实际上并不需要BOM。

缺点

你无法从UNICODE字符数判断出UTF-8文本的字节数,因为UTF-8是一种变长编码它需要用2个字节编码那些用扩展ASCII字符集只需1个字节的字符ISOLatin-1是UNICODE的子集,但不是UTF-8的子集8位字符的UTF-8编码会被email网关过滤,因为internet信息最初设计为7位ASCII码。因此产生了UTF-7编码。UTF-8在它的表示中使用值100xxxxx的几率超过50%,而现存的实现如ISO2022,4873,6429和8859系统,会把它错认为是C1控制码。因此产生了UTF-7.5编码

相关词条

相关搜索

其它词条