在带有亚洲字符的 Javascript TextDecoder 中解码是如何工作的?

问题描述

let uint8Array = new Uint8Array([228,189,160,229,165,189]);

alert( new TextDecoder().decode(uint8Array) ); // 你好

这个编码是怎么变成亚洲字符的?

据我所知,UTF-8 是 8 位的。因此,如果我查看 utf-8 charset map,那么直到 255 为止我都没有任何亚洲字符。

关于调查比特

  1. 为输入寻找位
    [228,189].map(i => parseInt(i).toString(2))
    // ["11100100","10111101","10100000","11100101","10100101","10111101"]
  1. 寻找输出
    '你好'.split('').map((e,index) => '你好'.charCodeAt(index).toString(2) )
    // ["100111101100000","101100101111101"]

对我来说很神秘的事情:

  1. 输入中的总位数为 48,而输出中的总位数为 30。为什么?
  2. 位模式在某些地方也匹配,但不完全匹配。就像输入位数组中的第 3 个和第 6 个元素匹配输出位数组。

有什么我遗漏的吗?随时纠正我

解决方法

问完这个问题我觉得有点傻。

通过 UTF-8 RFC 和谷歌进行一些探索。我发现我对UTF-8的理解是错误的。

我以为 UTF-8 最多有 8 位,但那是错误的。

现实中

UTF-8 是一种可变长度编码,每个编码最少 8 位 特点。具有更高代码点的字符最多需要 32 位。

这有帮助:How many characters can UTF-8 encode?