0%

utf8编码

是越南语意大利的意思(网上查的,未必准确,不过这个不是重点)
从字面上看应该是1个字符
用erlang转出来的list也应该是1个
BUT ….

通过http://utf8.supfree.net/,我们知道:中文的utf8编码是我,对应的10进制是25105
我们继续看字符,这个转出来的是[89, 771],怎么是两个字符呢???

先来个测试:

1
2
3
4
5
6
7
8
t() ->
A = <<"Ỹ">>,
A1 = unicode:characters_to_list(A),
io:format("B1: ~w~n", [A1]),

B = <<"我">>,
B1 = unicode:characters_to_list(B),
io:format("C1: ~w~n", [B1]).

执行结果:

1
2
A1: [89,771]
B1: [25105]

unicode编码规则

Unicode编码(16进制) UTF-8 字节流(二进制)
000000 - 00007F 0xxxxxxx
000080 - 0007FF 110xxxxx 10xxxxxx
000800 - 00FFFF 1110xxxx 10xxxxxx 10xxxxxx
010000 - 10FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

上表是utf8的编码规则,具体含义请看参考文档-1

问题继续

继续最开始的问题 …

771对应的16进制是0x303,在000080 - 0007FF范围内,
771对应的2进制是01100 000011,对应表得出,110 01100(204) 10 000011(131), 最终编码是0xCC83

同上,89对应的01011001(89),最终编码是0x59

因此,尽管看起来是一个字符,实际上是两个utf8字符

参考文档

  1. http://blog.sina.com.cn/s/blog_63733daa0100qe9n.html
  2. http://blog.csdn.net/sandyen/article/details/1108168
  3. http://utf8.supfree.net/
  4. http://www.ynzd.org/