UTF-8中汉字的字节长度

时间:2023-01-11 10:26:15

原文: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