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

JavaScript读取UTF-8文件时索引大于127的字符被替换为�如何解决

问题根因

File.text() 方法固定以UTF-8编码解析文件内容。码值大于127的字符被替换为�,核心原因是你读取的目标文件并非合法UTF-8编码:

  • 按照UTF-8编码规则,字节值大于127时必须作为多字节字符序列的组成部分存在,单独出现的大于127的字节会被判定为非法编码,自动替换为U+FFFD替换字符,也就是你看到的乱码。
  • 你提到文件包含0255全范围索引的字符,说明文件实际是单字节编码(最典型的是ISO-8859-1/Latin-1编码,该编码规则下每个字节值直接对应Unicode码点0255的字符,不存在多字节序列)。
修复方案

不要直接调用固定使用UTF-8编码的text()方法,改为先将文件读取为二进制ArrayBuffer,再使用对应编码的TextDecoder完成解码。如果需要保留0~255每个字节的原始值不丢失,直接使用ISO-8859-1编码解码即可。

修正后的完整代码如下:

HTML代码

<input type="file" style="font-size:20px" onchange="next(this)">
<div id="data"></div>

注意:input是自闭合标签,不需要额外添加</input>闭合标签。

JavaScript代码

async function next(elem){
  const file = elem.files[0];
  // 先将文件读取为二进制缓冲区
  const buffer = await file.arrayBuffer();
  // 用ISO-8859-1编码解码,单字节0-255完全映射无转码丢失
  const decoder = new TextDecoder('iso-8859-1');
  const content = decoder.decode(buffer);
  document.getElementById("data").innerText = content;
}

如果你的文件实际是其他本地编码(比如GBK、GB2312),只需要把TextDecoder的入参替换为对应编码标识即可,例如解码GBK文件时写为new TextDecoder('gbk')。

内容的提问来源于stack exchange,提问作者aplua

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 16:27:48