我正在使用 Windows 11 和“新 Windows 终端”(Windows 11 中的默认应用程序和“主”应用程序,用于使用控制台,而不是旧的cmd.exe
或新的PowerShell.exe
)。它具有开箱即用的 UTF-8 支持,并且可以显示非拉丁字符、表情符号等(如果它们采用 UTF-8 代码页)。
在该终端中,我运行默认的 Ubuntu wsl 配置文件。从 wsl Ubuntu 命令行 Issh
到远程非 Windows 服务器。
如果服务器使用 UTF-8 代码页,一切看起来都很好。但如果服务器使用“经典”非 UTF 代码页,我在终端中看不到非拉丁字符。附图的左侧部分显示了问题。
例如,我有一个旧的 FreeBSD 服务器,它不支持开箱即用的控制台中的 UTF-8(并且没有理由实现它 - 该服务器是工作了几十年的遗产)。
如果我使用putty
ssh 该服务器 - 我只需在“窗口”->“翻译”->“字符集”->“远程字符集”菜单中设置正确的代码页(通常KOI8-R
或Win1251 (Cyrillic)
对于设置使用西里尔字母的服务器来说是正确的选择)。
如何在“新Windows终端”中设置相同的行为?它有几十个设置,但我找不到有关代码页的任何信息。
或者也许我应该ssh
在 Windows 端使用一些特殊的(非终端)设置来动态转换远程服务器输出?
使用
luit
(或可能screen
)作为代码页转换的中间层。作为参考,“旧的 Windows 终端”通常被称为“Windows 控制台”,后来被称为“Conhost”。它不是 Cmd/PowerShell 的一部分。
它不需要 – SSH 不以任何方式涉及远程系统的控制台(输出不通过 syscons);它所需要的只是让程序输出UTF-8 编码的数据。例如,从这个意义上说,2008 年安装的 FreeBSD 就已经支持 UTF-8。
Windows Terminal似乎没有这样的设置,它依赖底层控制台系统来执行翻译(它仍然与Conhost共享此代码的核心)。打开常规 PowerShell 或 Cmd 选项卡,然后测试如果在
chcp 878
从同一选项卡输入 WSL 之前运行会发生什么情况。Windows 控制台中的代码页通常有点奇怪,因为底层系统基于 UTF-16,但有两个 API,一个用于编写“OEM 代码页”文本,另一个用于编写 UTF-16 文本。传统上,“OEM 代码页”设置为 437 或 775 之类的值(大致相当于系统设置的“ANSI”代码页的 MS-DOS),尽管现在 Windows 终端将其设置为 65001,表明它需要 UTF-8 。理论上,如果你这样做
chcp 878
,这将使控制台与 KOI8-R 一起工作。因此,由于 Conhost 长期使用 UTF-16 或 OEM 代码页,Win32-OpenSSH 中实际上还有另一个转换层 -
ssh.exe
Windows 附带的版本在运行时始终将控制台代码页设置为 65001,并假设输出来自 SSH 服务器的信息将是 UTF-8。这不会影响ssh
您在 WSL 中使用的 Linux 命令...但我强烈怀疑wsl.exe
您用来进入整个 Ubuntu 环境的命令可能会做同样的事情 – 它可能总是强制控制台为 UTF-8,甚至翻译成 UTF-16。