utf-8编码

UTF-8
编辑

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

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, Babylonian Cuneiform, 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 二进制的位数除以6来计算。
示例
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-BasicMultilingualPlain)的 字符被编码为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、付费专栏及课程。

余额充值