UTF-8

UTF-8

UTF-8(8-bit Unicode Transformation Format)是一种针对 Unicode的可变长度 字符编码,又称万国码。由Ken Thompson于1992年创建。现在已经标准化为RFC 3629。UTF-8用1到6个 字节编码UNICODE 字符。用在网页上可以同一页面显示 中文简体繁体及其它语言(如英文,日文,韩文)。
中文名
UTF-8
外文名
8-bit Unicode Transformation Format
别    称
万国码
作    者
Ken Thompson
创建时间
1992年
针    对

1发展历程编辑

数据结构简要 数据结构简要
在所有 字符集中,最知名的可能要数被称为 ASCII的7位字符集了。它是 美国标准信息交换代码(American Standard Code for Information Interchange)的缩写, 为美国英语通信所设计。它由128个 字符组成,包括大小写字母、数字0-9、标点符号、非 打印字符(换行符、 制表符等4个)以及 控制字符(退格、响铃等)组成。
但是,由于他是针对英语设计的,当处理带有音调标号(形如汉语的拼音)的亚洲文字时就会出现问题。因此,创建出了一些包括255个字符的由ASCII扩展的字符集。其中有一种通常被称为IBM字符集,它把值为128-255之间的字符用于画图和画线,以及一些特殊的欧洲字符。另一种8位字符集是 ISO 8859-1Latin 1,也简称为ISOLatin-1。它把位于128-255之间的 字符用于拉丁字母表中特殊语言字符的编码,也因此而得名。
ASCII码格式 ASCII码格式
欧洲语言不是地球上的唯一语言,因此亚洲和非洲语言并不能被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,  BabylonianCuneiform, Balti, Brahmi, Etruscan, Hittite, Javanese, Numidian, Old Persian Cuneiform, Syrian之类的古老文字。
事实证明,对可以用 ASCII表示的 字符使用UNICODE并不高效,因为UNICODE比ASCII占用大一倍的空间,而对ASCII来说高 字节的0对他毫无用处。为了解决这个问题,就出现了一些中间格式的 字符集,他们被称为通用转换格式,即 UTF(Universal Transformation Format)。常见的UTF格式有:UTF-7, UTF-7.5, UTF-8, UTF-16, 以及  UTF-32

2字符集编辑

如果UNICODE 字符由2个 字节表示,则编码成UTF-8很可能需要3个字节。而如果UNICODE字符由4个字节表示,则编码成UTF-8可能需要6个字节。用4个或6个字节去编码一个UNICODE字符可能太多了,但很少会遇到那样的UNICODE字符。 UTF-8转换表表示如下:
Unicode/UCS-4
bit数
UTF-8
byte数
备注
0000 ~
007F
0~7
0XXX XXXX
1
 
0080 ~
07FF
8~11
110X XXXX
10XX XXXX
2
 
0800 ~
FFFF
12~16
1110XXXX
10XX XXXX
10XX XXXX
3
基本定义范围:0~FFFF
1 0000 ~
1F FFFF
17~21
1111 0XXX
10XX XXXX
10XX XXXX
10XX XXXX
4
Unicode6.1定义范围:0~10 FFFF
20 0000 ~
3FF FFFF
22~26
1111 10XX
10XX XXXX
10XX XXXX
10XX XXXX
10XX XXXX
5
说明:此非unicode编码范围,属于UCS-4 编码
早期的规范UTF-8可以到达6字节序列,可以覆盖到31位元(通用字符集原来的极限)。尽管如此,2003年11月UTF-8 被 RFC 3629 重新规范,只能使用原来Unicode定义的区域, U+0000到U+10FFFF。根据规范,这些字节值将无法出现在合法 UTF-8序列中
400 0000 ~
7FFF FFFF
27~31
1111 110X
10XX XXXX
10XX XXXX
10XX XXXX
10XX XXXX
10XX XXXX
6
实际表示ASCII 字符的UNICODE字符,将会编码成1个 字节,并且UTF-8表示与ASCII字符表示是一样的。所有其他的UNICODE字符转化成UTF-8将需要至少2个字节。每个字节由一个 换码序列开始。第一个字节由唯一的换码序列,由n位连续的1加一位0组成, 首字节连续的1的个数表示 字符编码所需的字节数。
Unicode转换为UTF-8时,可以将Unicode二进制从低位往高位取出二进制数字,每次取6位,如上述的二进制就可以分别取出为如下示例所示的格式,前面按格式填补,不足8位用0填补。
注:Unicode转换为UTF-8需要的字节数可以根据这个规则计算:如果Unicode小于0X80(Ascii字符),则转换后为1个字节。否则转换后的字节数为Unicode二进制位数加3再除以5。
示例
UNICODE uCA(1100 1010) 编码成UTF-8将需要2个 字节
uCA -> C3 8A
UNICODE uF03F (11110000 0011 1111) 编码成UTF-8将需要3个字节:
u F03F -> EF 80 BF
Unicode 16进制
Unicode 2进制
bit数
UTF-8 2进制
UTF-8 16进制
CA
1100 1010
8
1100 0011 1000 1010
C3 8A
F0 3F
11110000 0011 1111
16
11101111 1000 0000 1011 1111
EF 80 BF

3优缺点编辑

优点

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

缺点

你无法从UNICODE 字符数判断出UTF-8文本的 字节数,因为UTF-8是一种 变长编码它需要用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编码。

4修正更新编辑

java使用UTF-16表示内部文本,并支持用于 字符串行化的非标准的修正UTF-8编码。
UTF-8保存使用 UTF-8保存使用
标准UTF-8和修正的UTF-8有两点不同:
修正的UTF-8中,null 字符编码成2个 字节(1100000010000000)而不是标准的1个字节(00000000),这样作可以保证编码后的字符串中不会嵌入null字符。因此如果在 类C语言中处理 字符串,文本不会在第一个null字符时截断(C字符串以'\0'结尾)。
在标准UTF-8编码中,超出基本多语言范围(BMP-Basic Multilingual Plane)的字符被编码为4字节格式,但是在修正的UTF-8编码中,他们由 代理编码对(surrogatepairs)表示,然后这些代理编码对在序列中分别重新编码。结果标准UTF-8编码中需要4个 字节的字符,在修正后的UTF-8编码中将需要6个字节。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值