UTF-8(8位元,Universal Character Set/Unicode Transformation Format)是针对Unicode的一种可变长度
字符编码。它可以用来表示Unicode标准中的任何字符,而且其编码中的第一个字节仍与
ASCII相容,使得原来处理ASCII字符的软件无需或只进行少部分修改后,便可继续使用。因此,它逐渐成为
电子邮件、网页及其他存储或传送文字的应用中,优先采用的编码。
在所有
字符集中,最知名的可能要数被称为
ASCII的8位字符集了。它是
美国标准信息交换代码(American Standard Code for Information Interchange)的缩写,为
美国英语通信所设计。它由128个字符组成,包括大小写字母、数字0-9、标点符号、非打印字符(
换行符、
制表符等4个)以及
控制字符(退格、响铃等)组成。
但是,由于它是针对英语设计的,当处理带有音调
标号(形如汉语的拼音)的
亚洲文字时就会出现问题。因此,创建出了一些包括256个字符的由ASCII扩展的字符集。其中有一种通常被称为
IBM字符集,它把值为128-255之间的字符用于画图和画线,以及一些特殊的欧洲字符。另一种8位字符集是ISO 8859-1Latin 1,也简称为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字节)
在Unicode
官方资料中,Unicode的编码方式有三种:UTF-8、
UTF-16、
UTF-32。由于UTF-8与
字节序无关(无需
BOM),同时兼容
ASCII编码,使得UTF-8编码成为现今互联网信息编码标准而被广泛使用。
UCS字符U+0000到U+007F(ASCII)被编码为字节0x00到0x7F(ASCII兼容)。这意味着只包含7位ASCII字符的文件在ASCII和UTF-8两种
编码方式下是一样的。
所有大于0x007F的UCS字符被编码为一个有多个字节的串,每个字节都有标记位集。因此,ASCII字节(0x00-0x7F)不可能作为任何其他字符的一部分。表示非ASCII字符的多字节串的第一个字节总是在0xC0到0XFD的范围里,并指出这个字符包含多少个字节。多字节串的其余字节都在0x80到0xBF范围里。这使得重新同步非常容易,并使编码无国界,且很少受丢失字节的影响。
UTF8分成单字节、双字节、三字节、四字节模式。UTF-8编码字符理论上可以最多到4个字节长,然而16位
BMP字符最多只用到3字节长,Bigendian UCS-4字节串的排列顺序是预定的,字节0xFE和0xFF在UTF-8编码中从未用到。
·带有
变音符号的
拉丁文、
希腊文、
西里尔字母、
亚美尼亚语、
希伯来文、
阿拉伯文、
叙利亚文等字母则需要2字节编码(Unicode范围由U+0080~U+07FF)。
注:每种编码可能有多个编码范围,每个编码范围间,以空格作为每个字节的
分隔符。例如UTF8-3的第一个编码,其第一个字节取值必须为0xE0,第二个字节范围为0xA0-0xBF,第三个字节为0x80-0xBF。
UTF-8编码可以通过屏蔽位和移位操作快速读写。字符串比较时
strcmp()和
wcscmp()的返回结果相同,因此使排序变得更加容易。字节FF和FE在UTF-8编码中永远不会出现,因此他们可以用来区分
UTF-16或
UTF-32文本。
UTF-8是
字节顺序无关的。它的字节顺序在所有系统中都是一样的,因此它实际上并不需要
BOM。
它需要用2个字节编码那些用
扩展ASCII字符集只需1个字节的字符ISO Latin-1是UNICODE的子集,但不是
UTF-8的子集8位字符的UTF-8编码会被email网关过滤,因为internet信息最初设计为7位ASCII码。因此产生了UTF-7编码。UTF-8在它的表示中使用值100xxxxx的几率超过50%,而现存的实现如ISO 2022,4873,6429,和8859系统,会把它错认为是C1控制码。因此产生了UTF-7.5编码。