终端中 pnpm 更新提示框乱码

场景

在用IDEA本地跑Halo时,终端输出了一段乱码如下。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

   鈺攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈺?
                                                                                                                                      鈹?                                        鈹?
                      鈹?  Update available! 10.34.1 鈫?11.5.1.   鈹?
                                                                        鈹?  Changelog: htlog: https://pnpm.io/v/11.5.1   鈹?
                                                                                                                                鈹?   To update, run: pnpm add -g pnpm     鈹?
                鈹?                                        鈹?
                                                                 鈺扳攢鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈹€鈺?

经过如下步骤,得以解决。

问题定位

典型的终端字符编码问题,pnpm 的更新提示框使用了 Unicode 的方框绘图字符(Box-drawing characters),但你的终端未能正确解码,显示成了乱码和类似 鈺 鈹 的符号。

1. 检查并修改 IDEA 终端编码

File > Setting

Editor > File Encodings

经检查,均为UTF-8,没有问题。

2. 检查终端的当前字符编码

命令如下:

  • Linux / macOS / Git Bash:locale ,关注输出中的 LC_ALLLC_CTYPELANG 变量

    • 如果显示类似 zh_CN.UTF-8,说明是 UTF-8;

    • 如果显示 zh_CN.GBKzh_CN.GB2312,那就是中文编码,这就会导致乱码。

  • Windows(CMD):chcp ,关注返回的数字代码页:

    • 936 = GBK

    • 65001 = UTF-8

  • Windows(PowerShell):[System.Text.Encoding]::Default.EncodingName$OutputEncoding

当前使用的是PowerShell,输入[Console]::OutputEncoding,得到如下输出:

input:[System.Text.Encoding]::Default.EncodingName

Unicode (UTF-8)

当前 PowerShell 的默认编码已经是 UTF-8 了,所以问题不在系统层面。

乱码是在输出过程中发生的。pnpm 的这个更新提示框是通过 stdout(标准输出) 打印的,在 Windows 下,PowerShell 的 $OutputEncoding[Console]::OutputEncoding 可能仍然不是 UTF-8。

3. 检查控制台实际输出编码

# 1. 查看 PowerShell 管道编码
$OutputEncoding

# 2. 查看控制台实际输出编码(这个最关键)
[Console]::OutputEncoding

# 3. 再次确认当前代码页
chcp

通过验证发现[Console]::OutputEncodingGB2312(代码页 936),实际输出如下:

input:[Console]::OutputEncoding                   

EncodingName      : Chinese Simplified (GB2312)
WebName           : gb2312
HeaderName        : gb2312
BodyName          : gb2312
Preamble          : 
WindowsCodePage   : 
IsBrowserDisplay  : 
IsBrowserSave     : 
IsMailNewsDisplay : 
IsMailNewsSave    : 
IsSingleByte      : False
EncoderFallback   : System.Text.InternalEncoderBestFitFallback
DecoderFallback   : System.Text.InternalDecoderBestFitFallback
IsReadOnly        : False
CodePage          : 936

解决方案

方案一:修改IDEA的Shell path(无效)

  1. SettingsToolsTerminal 中找到 Shell path

  2. 将原路径:"C:\Program Files\PowerShell\7\pwsh.exe"替换为:

    "C:\Program Files\PowerShell\7\pwsh.exe" -NoExit -Command "[Console]::OutputEncoding = [System.Text.Encoding]::UTF8; chcp 65001 > $null"
  3. Environment variables 中加上:LESSCHARSET=utf-8

实践后,终端无法启动,经过验证为无效方案。

方案二:通过 PowerShell 配置文件

在当前的 IDEA 终端中运行:

# 如果配置文件不存在则创建
if (!(Test-Path $PROFILE)) { New-Item -Path $PROFILE -Type File -Force }

# 用记事本打开配置文件
notepad $PROFILE

在打开的 Microsoft.PowerShell_profile.ps1 文件末尾添加:

# 强制控制台输出编码为 UTF-8,解决 IDEA 终端乱码
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
chcp 65001 > $null

经过验证后,终端乱码消失。

总结

通过本次踩坑,了解了如下知识:

  • Windows PowerShell出现乱码的解决方案

  • IDEA Shell设置方式(部分)

评论