2012年5月3日木曜日

[字符集编码] UTF-8 与 Unicode 转换规则

[wiki]
http://en.wikipedia.org/wiki/UTF-8

[UTF-8 encoding table and Unicode characters]
http://www.utf8-chartable.de/unicode-utf8-table.pl

Unicode 定义了统一的字符编码, 但没有定义字符如何存储
UTF-8 是 Unicode 的实现 (存储) 方式之一, 是一种变长编码方式, 可以使用 1~4 个字节表示一个字符, 根据不同的字符而变化字节长度

1. UTF-8 编码规则

1-1. 对于单字节的字符, 字节的第一位设为 0, 后面 7 位为这个符号的 unicode 码, 因此 UTF-8 编码兼容 ASCII 码

1-2. 对于 n 字节的字符 (n>1), 第一个字节的前 n 位都设为 1, 第 n+1 位设为 0, 后面字节的前两位一律设为 10, 剩下的没有提及的二进制位全部设为这个符号的 unicode 码

下表总结了编码规则, 字母 x 表示可用的编码位

  Unicode 符号范围    |         UTF-8 编码方式
      十六进制        |             二进制
----------------------+------------------------------------
0000 0000 - 0000 007F | 0xxxxxxx
0000 0080 - 0000 07FF | 110xxxxx 10xxxxxx
0000 0800 - 0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000 - 0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

以汉字 "中" 为例, unicode 是 4E2D (01001110 00101101)
根据上表, 4E2D 处在第三行的范围内 (只对比范围内的最大值即可), 因此 UTF-8 编码需要三个字节, 即格式是 "1110xxxx 10xxxxxx 10xxxxxx". 然后, 从 "中" 的最后一个二进制位开始, 依次从后向前填入格式中的 x, 多出的位补 0, 这样就得到了 "中" 的 UTF-8 编码是 "11100100 10111000 10101101", 转换成十六进制就是 E4B8AD

0 件のコメント:

コメントを投稿