如何修复PuTTY显示乱码的问题?

通过PuTTY从Windows 7 PC连接到Ubuntu服务器时,我遇到了一些屏幕错误。

enter image description here

也就是说:

  • Midnight Commander (MC) 中“双绘制”了选择。
  • 其他字符,如线元素,被绘制成错误的字符(例如,“â”代替“|”)。

我用Mac OS X从同一台Ubuntu服务器连接到终端和SSH,并没有出现这些屏幕乱码(即一切看起来和工作正常)。我已经尝试过在PuTTY中调整字体设置,将Courier New更改为Consolas,但没有成功。

因此,我的问题是:

如何配置PuTTY以正确显示特殊字符,而不是双重绘制/覆盖屏幕行?


2使用SecureCRT:选择选项->会话选项->终端->外观->字符编码->选择:UTF-8。希望能帮助像我一样的其他人! - Vunb
15个回答

你几乎可以肯定在你的PuTTY设置中设置了错误的字符集。
通过运行以下命令验证远程系统上的字符集:
locale

这应该返回类似的内容:
LANG=de_DE.UTF-8
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
LC_COLLATE="de_DE.UTF-8"
LC_MONETARY="de_DE.UTF-8"
LC_MESSAGES="de_DE.UTF-8"
LC_PAPER="de_DE.UTF-8"
LC_NAME="de_DE.UTF-8"
LC_ADDRESS="de_DE.UTF-8"
LC_TELEPHONE="de_DE.UTF-8"
LC_MEASUREMENT="de_DE.UTF-8"
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=

所以请检查您的PuTTY设置,在“转换”下确保将字符集设置为UTF-8。

PuTTY Reconfiguration

你可能也需要调整线条绘制的设置,但这可能不太可能发生。

17在所有情况下,这还不够。您还应该将以下变量导出到您的环境中:NCURSES_NO_UTF8_ACS=1 更多信息 - Piotr Jurkiewicz
3如果locale返回POSIX,那么你很可能在sshd配置中禁用了usePAM。 - user2693017
6如果地区返回类似于“POSIX”,请在命令行中输入“update-locale LANG=en_US.utf8” - 请参阅https://www.thomas-krenn.com/de/wiki/Locales_unter_Ubuntu_konfigurieren - koppor
@michael-hampton,我的系统配置为使用en_US.UTF-8。我注意到不同的地方对于locale有不同的说法。有些地方提到我应该使用en_US,而其他地方提到我应该使用de_DE。我之前看到grep和其他核心工具使用locale来设置字符集,我相信。更改这个的影响是什么? - alpha_989
@koppor,你提到将语言环境更改为en_US,而michael提到将语言环境更改为de_DE。哪一个是正确的? - alpha_989
@alpha_989 你应该使用你所期望的语言/国家。这将改变大多数程序用来向你显示信息的语言。 - Michael Hampton
啊,好的,明白了。感谢解释,@Michael-hompton。嗯,我也是这么想的。但是我注意到你在NH,不在德国。所以我不确定是否应该使用那个。无论如何,我遇到的问题与此无关,但我已经解决了:https://superuser.com/questions/278286/making-256-color-and-line-drawing-characters-both-work-in-putty/278337?noredirect=1#comment1867277_278337。 - alpha_989


2非常好。简单而且有效。(至少在Debian/Ubuntu上是这样的。) - Nate
1这个在PuTTY上运行得很好,但是它引入了另一个(较小的)问题:无法再远程控制窗口标题的更改。 - ADTC
非常好。已解决了在Ubuntu Artful上使用ncmpc的问题。 - weberjn

15年后,我再次感到烦恼并进行了谷歌搜索,找到了这个,选择了

更改设置 → 窗口 → 翻译 → 远程字符集 → "使用字体编码"

问题就解决了。


对我来说,UTF-8已经设置好了,但是它没有起作用,相反,将其设置为这个才有效。 - SergeantSerk
1当我设置为“使用字体编码”时,例如在armbian-config中的字符是正确的,但在Midnight Commander中的字符是错误的;反之亦然-当我设置为“UTF-8”时,在armbian-config中的字符是错误的,但在Midnight Commander中的字符是正确的。 - Chupo_cro
1我也将UTF-8设置为了,但是当我使用“pm2 monit”命令连续更新屏幕时它没有生效。改为设置“使用字体编码”后修复了该过程,所以我很高兴几分钟。但是,后来我使用了“pm2 status”命令,该命令只在屏幕上绘制一次方框...而它现在显示垃圾字符而不是线条。就好像你不能同时让两者都起作用。不过,在普通的Linux shell终端中没有问题。 - BrentHarsh

窗口 → 翻译 → "即使在UTF-8模式下也启用VT100线条绘制"。

这对我来说修复了mcwavemon的显示问题。

enter image description here


1是的,这样修复了aptitudeiptraf-ng,而不会破坏mc。(将Terminal type string设置为xtermxterm-256color)。 另请参阅https://superuser.com/questions/278286/making-256-color-and-line-drawing-characters-both-work-in-putty - tehnicaorg
1这是真正的答案。如果你将其设置为UTF8,vt100线绘制就无法工作。 - Mr. Beeblebrox
这个方法对我在使用 pm2tmux 时有效(其他答案可能只能适用于其中一个,而不能同时适用于两者)。 - Eric Mutta
只有在Windows下使用pm2 monit才能正常工作的答案。 - philk


对于那些不幸来到这里的老VMS人员:
PuTTY → 窗口 → 翻译 → 远程字符集 → DEC-MCS
对我有效。

两个基本因素是在putty中的Window/Translation UTF-8和Linux中的语言环境设置,按照这里和其他许多地方的指示。

此外,在putty中将Connection/Data/Terminal-type字符串设置为putty,或者在Linux中导出NCURSES_NO_UTF8_ACS=1可能会有帮助。这两个也在多个地方提到。

但是:由于默认字体如Courier和Lucida Console不包含所有Unicode字符,您仍然可能遇到一些字符显示为方块的情况。下载并安装http://dejavu-fonts.org/wiki/Download,并将putty设置为使用它。

对我来说,最后这个技巧对于使noping(推荐!)显示所有图形字符是必要的。


3对我来说,export NCURSES_NO_UTF8_ACS=1 效果最好。只需要记住在运行 iftop 时,在 sudo 命令中使用 -E 选项以保持该环境设置。sudo -E iftop - HeatfanJohn
NCURSES_NO_UTF8_ACS=1 不再需要。请参考 https://superuser.com/questions/278286/making-256-color-and-line-drawing-characters-both-work-in-putty 了解如何在 PuTTY 0.71+ 中启用 VT100 绘图字符。 - tehnicaorg

在我的情况下(Ubuntu 14.04),这个问题是由缺失引起的。
UsePAM yes    

/etc/ssh/sshd_config文件中的条目作为默认配置,负责将/etc/default/locale加载到用户环境中。

1这个对我来说解决了问题。 - Martin

我在使用Docker机器时寻找了许多解决方案(包括本地和由系统管理员设置的机器)。在我的Putty中一切正常(我使用的是UTF-8),我还使用了其他SSH客户端,但遇到了完全相同的问题。
运行:
mc -ac

在解决问题时(但并不完全),我一直在寻找完整的解决方案。
阅读了许多建议后,我终于找到了解决我的问题的方法。
在终端运行以下命令:
locale

验证您所设置的区域设置。默认情况下,我使用的是 C 区域设置。

要验证所有已安装的区域设置,请运行 locale -a

例如,我有:

C
C.UTF-8
POSIX

默认情况下。

解决方案是导出LANG变量,并使用C.UTF-8区域设置,如下所示:

export LANG="C.UTF-8"

你可以明显地将它添加到.bashrc中,以便在你的配置文件中自动设置。


1更改LANG变量会有什么副作用?如果您已经将LANG设置为C.UTF-8,为什么还要再次导出它呢? - alpha_989

如许多答案中所提到的:
Putty > Window > Translation > Remote character set > UTF8
是解决方案。
但是别忘了去 Session > Default settings 并点击 Save。虽然没有显示任何确认成功的消息,但它确实会成为默认设置。

enter image description here