Windows环境下yarn运行脚本时console.log的UTF-16代理对表情显示异常
问题成因
该问题仅出现在Yarn 1.x的Windows版本中,核心原因是Yarn 1.x创建子进程时默认不继承终端的编码配置,强制使用系统默认的ANSI代码页(简体中文系统通常为936 GBK)处理输出。
你代码输出的emoji是UTF-8编码的4字节字符,Yarn会将这部分字节流按GBK规则拆分解析,无法匹配GBK编码规则的字节会被替换为乱码标识�后再输出到终端,因此哪怕终端本身支持UTF-16/UTF-8字符展示,最终拿到的也是已经损坏的编码内容。
而直接运行Node、通过npm调用脚本时,两者都会默认继承终端的编码配置,不会主动修改子进程输出的编码规则,因此emoji可以正常展示。
解决方法
- 临时生效方案:运行Yarn命令前先执行编码切换指令,Git Bash/Windows Terminal中执行
chcp 65001切换终端代码页为UTF-8,再执行yarn run start即可正常输出emoji。 - 永久生效方案:在系统环境变量中新增两个变量
LC_ALL=zh_CN.UTF-8、LANG=zh_CN.UTF-8(英文系统设置为en_US.UTF-8),重启终端后所有Yarn命令都会默认使用UTF-8编码处理输出。 - 版本升级方案:升级到Yarn 2+(Berry)版本,该版本已经修复了Windows平台的默认编码问题,默认继承终端的编码配置,无需额外设置即可正常输出多字节字符。
- 代码兼容方案:如果不想修改环境配置,也可以在Node脚本的最开头添加一行代码
process.stdout.setEncoding('utf8'),强制标准输出使用UTF-8编码,绕过Yarn的编码转换逻辑。
内容的提问来源于stack exchange,提问作者Meldon
相关产品推荐
相关产品推荐

