在 Ubuntu 上运行 Node.js 程序时出现日志乱码,通常不是 Node.js 本身的问题,而是字符编码 / 终端环境不一致导致的。下面按常见原因逐一说明。
Ubuntu 终端默认应是 UTF-8,但如果:
LANG / LC_* 环境变量就容易出现乱码。
locale
正常应看到:
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
如果看到 POSIX 或 C,就会乱码。
sudo apt install locales
sudo locale-gen en_US.UTF-8
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
Node.js 默认使用 UTF-8,但如果:
console.log 打印了 Buffer就会乱码。
const fs = require('fs');
const data = fs.readFileSync('log.txt'); // GBK 文件
console.log(data.toString()); // 乱码
console.log(data.toString('utf8'));
如果是 GBK:
const iconv = require('iconv-lite');
console.log(iconv.decode(data, 'gbk'));
Docker 容器默认 没有 UTF-8 环境。
ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8
或:
ENV LANG=en_US.UTF-8
如果你在:
连接 Ubuntu,编码不对也会乱码。
GBK例如:
cat log.txt
乱码,但:
less log.txt
正常
可能是:
可用:
file log.txt
locale 是否是 UTF-8?toString() 了 Buffer?如果你愿意,可以把:
locale 输出发出来,我可以帮你精准定位。