Javascript TextEncoder为具有负值的数组的字节提供了额外的字节,TextDecoder为字节提供了错误的字符串

Javascript TextEncoder为具有负值的数组的字节提供了额外的字节,TextDecoder为字节提供了错误的字符串,javascript,Javascript,它不仅适用于负值,也适用于正值。还有其他选项吗?第1部分:字节不是负数 TextDecoder接口在Int8Array视图包装的基础ArrayBuffer(字节序列)上运行 这: 同: new TextDecoder('utf-8').decode(new Int8Array([-1, -1])) new TextDecoder('utf-8').decode(new Int8Array([-1, -1]).buffer) 这是一个包含字节0xFF,0xFF的ArrayBuffer。这与:

它不仅适用于负值,也适用于正值。还有其他选项吗?

第1部分:字节不是负数

TextDecoder接口在Int8Array视图包装的基础ArrayBuffer(字节序列)上运行

这:

同:

new TextDecoder('utf-8').decode(new Int8Array([-1, -1]))
new TextDecoder('utf-8').decode(new Int8Array([-1, -1]).buffer)
这是一个包含字节0xFF,0xFF的ArrayBuffer。这与:

new TextDecoder('utf-8').decode(new Int8Array([-1, -1]))
new TextDecoder('utf-8').decode(new Int8Array([-1, -1]).buffer)
第2部分:UTF-8解码

0xFF在UTF-8中不是有效的代码序列,因此它会作为错误进行解码。这将导致替换字符(U+FFFD)。因为有两个0xFF字节,所以得到U+FFFD U+FFFD或:

"��"

第3部分:UTF-8编码

将U+FFFD编码为UTF-8会得到字节0xEF 0xBF 0xBD。因此,用U+FFFD U+FFFD编码字符串会得到字节0xEF 0xBF 0xBD或十进制:239 191 189 239 191 189

…这正是你得到的结果

因此,这是工作完全符合规定

那么……有什么问题吗?

我的猜测是,您假设可以将任何字节编码为字符串。这不是文本编码的工作方式。文本编码定义了从字符串元素到字节序列的映射

并非所有编码都可以表示字符串的所有元素,但UTF-8(和UTF-16)可以表示JavaScript字符串中可能出现的所有代码点

但事实并非如此。并非所有字节序列都对应于字符。当发现无效字节序列时,会发生错误。默认情况下,TextDecoder API生成替换字符(� U+FFFD),但您可以使用
fatal
标志使其引发异常