原文:http://wenwen.sogou.com/z/q550898818.htm
1、美国人首先对其英文字符进行了编码,也就是最早的ascii码,用一个字节的低7位来表示英文的128个字符,高1位统一为0;
2、后来 欧洲 人发现 尼玛 你这128位哪够用,比如我高贵的 法国人 字母上面的还有注 音符 ,这个怎么区分,得,把高1位编进来吧,这样 欧洲 普遍使用一个全 字节 进行 编码 ,最多可表示256位。 欧美 人就是喜欢直来直去, 字符 少, 编码 用得位数少;
3、但是即使位数少,不同国家地区用不同的 字符 编码 ,虽然0--127表示的符号是一样的,但是128--255这一段的解释完全乱套了,即使2 进制 完 全一 样,表示的 字符 完全不一样,比如135在 法语 , 希伯来语 ,俄语 编码 中完全是不同的符号;
4、更麻烦的是, 尼玛 这 电脑 高科 技传到中国后,中国人发现我们有10万多个汉字,你们 欧美 这256字塞 牙缝 都不够。于是就发明了GB2312这些 汉字 编码 ,典型的用2个 字节 来表示绝大部分的 常用汉字 ,最多可以表示65536个汉字 字符 ,这样就不难理解有些汉字你在 新华字典 里查得到,但是 电脑 上如果不处理一下你是显示不出来的了吧。
5、这下各用各的 字符 集 编码 ,这世界咋统一? 俄国人 发封email给中国人,两边 字符 集 编码 不同, 尼玛 显示都是乱码啊。为了统一,于是就发明了unicode,将世界上所有的符号都纳入其中,每一个符号都给予一个 独一无二 的 编码 ,现在unicode可以容纳100多万个符号,每个符号的 编码 都不一样,这下可统一了,所有语言都可以互通, 一个网 页页面里可以同时显示各 国文 字。
6、然而,unicode虽然统一了全世界 字符 的二 进制 编码 ,但没有规定如何 存储 啊,亲。x86和amd 体系结构 的 电脑 小端序和大端序都分不清,别提 计算机 如何识别到底是unicode还是acsii了。如果Unicode统一规定,每个符号用三个或四个 字节 表示,那么每个 英文字母 前都必然有二到三个 字节 是0, 文本文件 的大小会因此大出二三倍,这对于 存储 来说是极大的浪费。这样导致一个后果:出现了Unicode的多种 存储 方式。
7、互联网的兴起,网页上要显示各种 字符 ,必须统一啊,亲。utf-8就是Unicode最重要的实现方式之一。另外还有utf-16、utf-32等。UTF-8不是固定字长 编码 的,而是一种变长的 编码 方式。它可以使用1~4个 字节 表示一个符号,根据不同的符号而变化 字节 长度。这是种比较巧妙的设计,如果一个 字节 的第一位是0,则这个 字节 单独就是一个 字符 ;如果第一位是1,则连续有多少个1,就表示当前 字符 占用多少个 字节 。
8、注意unicode的 字符 编码 和utf-8的 存储 编码 表示是不同的,例如"严"字的Unicode码是4E25,UTF-8 编码 是E4B8A5,这个7里面解释了的,UTF-8 编码 不仅考虑了 编码 ,还考虑了 存储 ,E4B8A5是在 存储 识别 编码 的基础上塞进了4E25。
9、UTF-8 使用一至四个 字节 为每个 字符 编码 。128 个 ASCII 字符 (Unicode 范围由 U+0000 至 U+007F)只需一个 字节 ,带有变 音符 号的 拉丁文 、 希腊文 、 西里尔字母 、 亚美尼亚语 、 希伯来文 、 阿拉伯文 、 叙利亚 文及 马尔代夫 语(Unicode 范围由 U+0080 至 U+07FF)需要二个 字节 ,其他基本多 文种 平面(BMP)中的 字符 (CJK属于此类-Qieqie注)使用三个 字节 ,其他 Unicode 辅助平面的 字符 使用四 字节 编码 。
10、最后,常规来看,中文汉字在utf-8中到底占几个字节,一般是3个字节,最常见的编码方式是1110xxxx 10xxxxxx 10xxxxxx。
字符集
如果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
|