const chunks = [];
socket.on('data', (c) => chunks.push(c));
socket.on('end', () => {
console.log(Buffer.concat(chunks).toString('utf8'));
});
把多个数据块分别转成字符串再拼接,中文偶尔变成问号或者乱码,出现的位置每次都不一样,英文和数字部分始终完全正常。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。
原因不复杂,一个汉字在 UTF 编码里占三个字节,网络分包刚好切在字节中间,单独转字符串等于把半个字符交给解码器,只能落成替换字符。
围绕「Buffer 中文乱码」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。
验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
处理上按这个顺序:先把所有数据块原样收集到一个数组里面存着;合并成一整块之后,再统一做一次完整的解码操作;不要对半截的字节单独调用字符串转换的方法。
改完只确认一件事:长文本解码后不再出现替换字符,字数与原文一致,日文和表情也正常。
