JS中Typed Array编解码结果与原数组不一致的原因咨询
为什么TextDecoder解码后再TextEncoder编码会得到不同的字节数组?
这是因为你输入的字节200(十六进制0xC8)不是合法的UTF-8序列,触发了TextDecoder的错误恢复机制,具体原因如下:
- UTF-8编码规则限制:UTF-8里单字节字符的范围是
0x00-0x7F(十进制0-127),超过127的字节必须作为多字节字符的一部分存在。比如0xC0-0xDF开头的字节需要跟一个0x80-0xBF的后续字节,才能组成合法的双字节字符。你的数组里只有0xC8这一个字节,属于不完整的非法UTF-8序列。 - 替换字符U+FFFD:TextDecoder默认遇到非法UTF-8序列时,不会抛出错误,而是用**替换字符(U+FFFD)**替代无效部分,这个字符就是我们常看到的
�。 - 编码替换字符的结果:当你用TextEncoder.encode这个替换字符时,得到的就是它的UTF-8编码,对应的字节数组就是
[239, 191, 189]。
如果不想让非法序列被替换,而是直接抛出错误,可以给TextDecoder加上fatal: true选项:
const encoder = new TextEncoder() const decoder = new TextDecoder('utf-8', { fatal: true }) const array = new Uint8Array([200]) try { const str = decoder.decode(array) console.log(encoder.encode(str)) } catch (e) { console.log('非法UTF-8序列:', e) }
另外要注意:TextEncoder/Decoder是专门处理UTF-8字符串与字节数组互转的工具,如果你的需求是处理任意二进制数据(而非UTF-8字符串),直接操作Uint8Array即可,不要用这两个API。
内容的提问来源于stack exchange,提问作者bugwheels94
相关产品推荐
相关产品推荐

