为什么Node.js中使用filter方法时UTF-8编码失效?
问题成因
- 你遇到的乱码是典型的UTF-8字节流被错误用Latin-1(ISO-8859-1)编码解析导致的:比如匈牙利语字符
ő的UTF-8编码为0xC5 0x91,按Latin-1解码就会显示为Ĺ,和你给出的乱码表现完全匹配。 - 之所以
find方法正常filter方法异常,是因为Array.find返回单个对象,JSON序列化后内容长度很短,res.write可以一次性完成写入,默认编码规则生效;而Array.filter返回数组,序列化后的内容长度大,触发Node.js HTTP响应流的分片写入逻辑,没有显式指定编码的场景下,部分分片会被默认用Latin-1编码传输,最终导致整体内容乱码。 - 额外排查点:你给出的示例中,
find返回的对象键为英文的type、text,filter返回的对象键为匈牙利语的tipus、szoveg,如果两者的数据源读取逻辑不同,也有可能是读取JSON文件时没有指定utf8编码,导致数据源本身就存在编码错误。
解决方法
方案1:强制转UTF-8 Buffer写入
显式把序列化后的字符串转成UTF-8 Buffer,彻底避免编码漂移:
res.setHeader("Content-type", "text/plain; charset=utf-8"); const result = myfile.filter((i) => i.type == type); // 显式生成UTF-8编码的Buffer res.write(Buffer.from(JSON.stringify(result, null, 4), 'utf8')); res.end();
方案2:显式指定写入编码
调用res.write时手动传入编码参数,覆盖默认逻辑:
res.setHeader("Content-type", "text/plain; charset=utf-8"); res.write(JSON.stringify(myfile.filter((i) => i.type == type), null, 4), 'utf8'); res.end();
数据源排查
如果你是从本地文件读取的myfile数据,确保读取时指定了正确的UTF-8编码:
// 错误写法:省略编码参数会返回Buffer,部分场景解析会出错 // const myfile = JSON.parse(fs.readFileSync('./data.json')) // 正确写法:指定utf8编码读取 const myfile = JSON.parse(fs.readFileSync('./data.json', 'utf8'))
内容的提问来源于stack exchange,提问作者RolandHU
相关产品推荐
相关产品推荐

