Java--UTF-8

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

发展历程

数据结构简要 数据结构简要
在全部 字符集中,最知名的可能要数被称为 ASCII的7位字符集了。它是 美国标准信息交换代码(American Standard Code for Information Interchange)的缩写, 为美国英语通讯所设计。它由128个 字符组成,包括大小写字母、数字0-九、标点符号、非 打印字符(换行符、 制表符等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
 

字符集

若是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二进制位数减1再除以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 00111000 1010
C3 8A
F0 3F
11110000 0011 1111
16
111011111000 00001011 1111
EF 80 BF
相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息