在 Linux 上运行 Node.js 程序时,日志出现乱码(如中文变成 ?????、方块、\uXXXX、或者终端显示异常)通常由以下几类原因造成:
Node.js 默认使用系统 locale 编码输出日志。
检查:
locale
如果看到:
LANG=C
LC_ALL=
或不是 UTF-8,就容易出现乱码。
解决:
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
或写入:
~/.bashrc
~/.zshrc
如:
需要设置:
Character encoding = UTF-8
console.log 输出非 UTF-8 文本Node.js 内部是 UTF-8,但如果:
直接 console.log 就会乱码。
示例(错误):
const fs = require('fs');
const data = fs.readFileSync('gbk.txt'); // GBK
console.log(data.toString()); // 乱码
解决:
const iconv = require('iconv-lite');
console.log(iconv.decode(data, 'gbk'));
node app.js > log.txt
如果:
cat / vim 但终端是 UTF-8就会看起来像乱码。
解决:
file log.txt
iconv -f gbk -t utf-8 log.txt
有些日志库支持:
示例(winston):
new winston.transports.File({
filename: 'app.log',
options: { encoding: 'utf8' }
})
Docker 默认可能是:
LANG=C
解决(Dockerfile):
ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8
\u4e2d\u6587这是 JSON 转义,不是乱码。
例如:
console.log(JSON.stringify({ msg: '中文' }))
解决:
console.log(JSON.stringify(obj, null, 2))
// 或
console.log(obj.msg)
locale 是否为 UTF-8如果你愿意,可以把:
发出来,我可以帮你精确判断是哪一种原因。