问题描述
let uint8Array = new Uint8Array([228,189,160,229,165,189]);
alert( new TextDecoder().decode(uint8Array) ); // 你好
这个编码是怎么变成亚洲字符的?
据我所知,UTF-8 是 8 位的。因此,如果我查看 utf-8 charset map,那么直到 255 为止我都没有任何亚洲字符。
关于调查比特
- 为输入寻找位
[228,189].map(i => parseInt(i).toString(2))
// ["11100100","10111101","10100000","11100101","10100101","10111101"]
- 寻找输出位
'你好'.split('').map((e,index) => '你好'.charCodeAt(index).toString(2) )
// ["100111101100000","101100101111101"]
对我来说很神秘的事情:
有什么我遗漏的吗?随时纠正我
解决方法
问完这个问题我觉得有点傻。
通过 UTF-8 RFC 和谷歌进行一些探索。我发现我对UTF-8的理解是错误的。
我以为 UTF-8 最多有 8 位,但那是错误的。
现实中
UTF-8 是一种可变长度编码,每个编码最少 8 位 特点。具有更高代码点的字符最多需要 32 位。