在 Debian 上 JS 日志乱码,通常不是 JS 本身的问题,而是字符编码 / 终端 / 文件编码不一致导致的。下面按最常见场景给你一套“排查 + 解决”思路。
䏿–‡ 这种 → UTF-8 被当成 Latin1 解码???? → 编码完全不支持locale
正常应该是:
LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8
如果不是 UTF-8:
sudo apt install locales
sudo dpkg-reconfigure locales
# 选 en_US.UTF-8 或 zh_CN.UTF-8
临时生效:
export LANG=en_US.UTF-8
export LC_ALL=en_US.UTF-8
Node 默认按 UTF-8 输出,但如果:
iconv / child_process 错误转码就会乱
✅ 确保启动环境是 UTF-8:
node app.js
前先:
export LANG=en.UTF-8
错误写法(容易乱码)
fs.writeFileSync('log.txt', str)
✅ 正确写法:
fs.writeFileSync('log.txt', str, 'utf8')
或:
const ws = fs.createWriteStream('log.txt', { encoding: 'utf8' })
如果你看到:
console.log('中文')
乱码 → 99% 是终端问题,不是 JS 问题
PM2 会继承系统 locale
解决:
pm2 stop all
export LANG=en_US.UTF-8
pm2 start app.js
或:
pm2 start app.js --env production
并在 ecosystem.config.js 里:
env: {
LANG: 'en_US.UTF-8'
}
Docker 默认是 POSIX
✅ Dockerfile 加:
ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8
或:
ENV LANG=en_US.UTF-8
如果你:
iconvBuffer.toString('binary')latin1就容易炸
✅ 统一只用:
Buffer.from(str, 'utf8').toString('utf8')
file log.txt
如果是:
log.txt: UTF-8 Unicode text
说明文件没问题,是终端问题
你可以直接贴:
我可以直接给你改好的代码版本。