UTF-8 (RFC3629)

UTF-8,全称Unicode Transformation Format 8-bit,使用变长编码表示Unicode字符集(0000~10FFFF),向后兼容ASCII。每个字符编码为1~4个字节长度,其中字符U+0000~U+007F编码为单字节长度 (ASCII ∈ UTF-8)。

编码方式:

将Unicode字符编码范围(10FFFF)划分为4部分:

  1. 0000~007F:单字节,0开头,2^{7}个字符
  2. 0080~07FF:双字节,110开头,2^{11}-2^{7}个字符
  3. 0800~FFFF:三字节,1110开头,2^{16}-2^{11}个字符
  4. 1 0000~10 FFFF:四字节,11110开头,2^{21}-2^{16}个字符

由于UTF-8是变长编码,需要使用标志位做字节流分割。比如一个字节以0开头,则一定表示单字节编码字符;以110开头,表示双字节编码字符;以1110开头,表示三字节编码字符;以1110开头表示四字节编码字符。

在每部分中,为了能够表示最大编码范围,对应的掩码位x依次为7位 (7F)、11位 (7FF)、16位 (FFFF)和21位 (10FFFF)。

编码过程:先根据字符序号大小确定字节数,将标志位/固定位填充,以字符序号二进制填充掩码位x。

解码过程:对一个字节根据标志位确定当前字符编码的字节数,读取字符编码所有字节,提取掩码位x计算字符序号。

并不是所有的字节序列都是有效的,单字节中的x可任意表示,双字节中的x只能表示80~7FF而不能表示0~7F,三字节中的x只能表示800~7FFF而无法表示0~7FF;四字节中的x只能表示10000~10FFFF而无法表示0~FFFF。因此虽然Unicode最少只需要21位就能编码所有字符,但是UTF-8中存在冗余编码,导致需要最大四字节(32位)来表示字符编码。

UTF-8语法表示:

  • UTF8-octets = *( UTF8-char )

  • UTF8-char   = UTF8-1 / UTF8-2 / UTF8-3 / UTF8-4

  • UTF8-1      = %x00-7F

  • UTF8-2      = %xC2-DF UTF8-tail

  • UTF8-3      = %xE0 %xA0-BF UTF8-tail / %xE1-EC 2( UTF8-tail ) /
                     %xED %x80-9F UTF8-tail / %xEE-EF 2( UTF8-tail )

  • UTF8-4      = %xF0 %x90-BF 2( UTF8-tail ) / %xF1-F3 3( UTF8-tail ) /
                     %xF4 %x80-8F 2( UTF8-tail )

  • UTF8-tail   = %x80-BF

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值