UTF

编辑:野禽网互动百科 时间:2020-04-06 06:34:50
编辑 锁定
本词条缺少信息栏,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧!
UTF-8是UNICODE的一种变长字符编码,由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个字节编码UNICODE字符

UTF简介

编辑
什么是UTF-8
UTF,是UnicodeTransformationFormat的缩写,意为Unicode转换格式。
如果UNICODE字符由2个字节表示,则编码成UTF-8很可能需要3个字节,而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。用4个或6个字节去编码一个UNICODE字符可能太多了,但很少会遇到那样的UNICODE字符。

UTF简史

编辑

UTFASCⅡ码

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

UTF扩展码

但是,由于他是针对英语设计的,当处理带有音调标号(形如汉语的拼音)的欧洲文字时就会出现问题。因此,创建出了一些包括255个字符的由ASCⅡ扩展的字符集。其中有一种通常被称为IBM字符集,它把值为128-255之间的字符用于画图和画线,以及一些特殊的欧洲字符。另一种8位字符集是ISO 8859-1Latin 1,也简称为ISO Latin-1。它把位于128-255之间的字符用于拉丁字母表中特殊语言字符的编码,也因此而得名。

UTF编码

欧洲语言不是地球上的唯一语言,因此亚洲和非洲语言并不能被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之类的古老的文字。

UTF转换格式

事实证明,对可以用ASCⅡ表示的字符使用UNICODE并不高效,因为UNICODE比ASCⅡ占用大一倍的空间,而对ASCⅡ来说高字节的0对他毫无用处。为了解决这个问题,就出现了一些中间格式的字符集,他们被称为通用转换格式,即UTF(Universal Transformation Format)。目前存在的UTF格式有:UTF-7,UTF-7.5,UTF-8,UTF-16,以及 UTF-32。本文讨论UTF-8字符集的基础。

UTFIE乱码

UNICODE(UTF-8)这个项目放在 IE 的菜单栏下是为了让你能够强制 IE 用 UTF-8字符集显示页面。
只有在页面编码为 UTF-8 但 IE 却无法正确地选择 UTF-8字符集来显示页面的时候,你才应该动用该项目。
如果你选择该项目,这个页面将被显示成乱码,因为这个页面的编码是 GB2312 (简体中文),不是 UTF-8。以不正确的编码显示页面就好像把汉语拼音当成法语来念,结果当然是没人能听懂的乱语。
首先 UCS 和 Unicode 只是分配整数给字符的编码表. 现在存在好几种将一串字符表示为一串字节的方法. 最显而易见的两种方法是将 Unicode 文本存储为 2 个 或 4 个字节序列的串. 这两种方法的正式名称分别为 UCS-2 和 UCS-4. 除非另外指定,否则大多数的字节都是这样的(Bigendian convention). 将一个 ASCⅡ 或 Latin-1 的文件转换成 UCS-2 只需简单地在每个 ASCⅡ 字节前插入 0x00. 如果要转换成 UCS-4,则必须在每个 ASCⅡ 字节前插入三个 0x00.
在 Unix 下使用 UCS-2 (或 UCS-4) 会导致非常严重的问题. 用这些编码的字符串会包含一些特殊的字符,比如 '\0' 或 '/',它们在 文件名和其他 C库函数参数里都有特别的含义. 另外,大多数使用 ASCⅡ 文件的 UNⅨ 下的工具,如果不进行重大修改是无法读取 16 位的字符的. 基于这些原因,在文件名,文本文件,环境变量等地方,UCS-2 不适合作为 Unicode 的外部编码.
在 ISO 10646-1 Annex R 和 RFC 2279 里定义的 UTF-8 编码没有这些问题. 它是在 Unix 风格的操作系统下使用 Unicode 的明显的方法.

UTF特性

编辑
UCS 字符 U+0000 到 U+007F (ASCⅡ) 被编码为字节0x00 到 0x7F (ASCⅡ 兼容). 这意味着只包含 7 位 ASCⅡ 字符的文件在 ASCⅡ 和 UTF-8 两种编码方式下是一样的.
所有 >U+007F 的 UCS字符被编码为一个多个字节的串,每个字节都有标记位集. 因此,ASCⅡ 字节 (0x00-0x7F) 不可能作为任何其他字符的一部分.
表示非 ASCⅡ字符的多字节串的第一个字节总是在 0xC0 到 0xFD 的范围里,并指出这个字符包含多少个字节. 多字节串的其余字节都在 0x80 到 0xBF 范围里. 这使得重新同步非常容易,并使编码无国界,且很少受丢失字节的影响.
可以编入所有可能的 231个 UCS 代码
UTF-8 编码字符理论上可以最多到 6 个字节长,然而 16 位 BMP 字符最多只用到 3 字节长.
Bigendian UCS-4字节串的排列顺序是预定的.
字节0xFE 和 0xFF 在 UTF-8 编码中从未用到.
下列字节串用来表示一个字符. 用到哪个串取决于该字符在 Unicode 中的序号.
U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 - U-03FFFFFF: 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
U-04000000 - U-7FFFFFFF: 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
xxx 的位置由字符编码数的二进制表示的位填入, 越靠右的 x 具有越少的特殊意义,只用最短的那个足够表达一个字符编码数的多字节串, 注意在多字节串中,第一个字节的开头"1"的数目就是整个串中字节的数目。
例如: Unicode字符U+00A9 = 1010 1001 (版权符号) 在 UTF-8 里的编码为:
11****1*1*1*1**1=0xC20xA9【注:*号代表0】
而字符U+2260 = **1* **1* * 11* **** 【注:*号代表0】(不等于) 编码为:
111****1* 1*** 1***1 1* 1***** = 0xE2 0x89 0xA0
这种编码的官方名字拼写为 UTF-8,其中 UTF 代表 UCS Transformation Format. 请勿在任何文档中用其他名字 (比如 utf8 或 UTF_8) 来表示 UTF-8,当然除非你指的是一个变量名而不是这种编码本身.

UTF优点

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

UTF缺点

编辑
你无法从UNICODE字符数判断出UTF-8文本的字节数,因为UTF-8是一种变长编码它需要用2个字节编码那些用扩展ASCⅡ字符集只需1个字节的字符 ISO Latin-1 是UNICODE的子集,但不是UTF-8的子集 8位字符的UTF-8编码会被email网关过滤,因为internet信息最初设计为7位ASCⅡ码。因此产生了UTF-7编码。UTF-8 在它的表示中使用值100xxxxx的几率超过50%, 而现存的实现如ISO 2022, 4873, 6429, 和8859系统,会把它错认为是C1 控制码。因此产生了UTF-7.5编码。
关于utf-8
java使用UTF-16表示内部文本,并支持用于字符串串行化的非标准的修正UTF-8编码。标准UTF-8和修正的UTF-8有两点不同:修正的UTF-8中,null字符编码成2个字节(11****** 1*******)【注:*号代表0】 而不是标准的1个字节(00000000),这样作可以保证编码后的字符串中不会嵌入null字符。因此如果在类C语言中处理字符串,文本不会在第一个null字符时截断(C字符串以null结尾)。在标准UTF-8编码中,超出基本多语言范围(BMP - Basic Multilingual Plain)的字符被编码为4字节格式,但是在修正的UTF-8编码中,他们由代理编码对(surrogate pairs)表示,然后这些代理编码对在序列中分别重新编码。结果标准UTF-8编码中需要4个字节的字符,在修正后的UTF-8编码中将需要6个字节。
词条标签:
计算机术语 计算机学