You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 00:05:05