我在使用 PowerShell 获取 Unicode 输出时遇到了一些问题,我使用以下方法部分解决了该问题:
[Console]::OutputEncoding = [Text.Encoding]::UTF8
但是我注意到这个设置有问题。如果我运行如下命令:
Get-Content a.txt
它不以 UTF8 输出。原因似乎是这样的:
默认使用与系统活动代码页 (通常为 ANSI) 相对应的编码。
那么如果[Console]::OutputEncoding
不改变代码页,那会改变什么呢?
答案1
如果[Console]::OutputEncoding
不改变代码页,那么会改变什么?
根据在 powershell 中将默认编码设置为 UTF-8你应该使用:
[Console]::OutputEncoding = [Text.UTF8Encoding]::UTF8
这与您使用的命令略有不同。
另一种方法是使用 chcp.com:
& "$env:windir\system32\chcp.com" 65001
经过测试,似乎 powershell 喜欢处理 BOM 编码的 UTF8 文件。
如果您的文件没有 BOM 编码,您可以使用-encoding utf8
。
非 BOM 编码的 UTF8 文件示例:
> get-content test.txt
Greek (in Polytonic):
The Greek anthem:
Σὲ γνωÏίζω ἀπὸ τὴν κόψη
τοῦ σπαθιοῦ τὴν Ï„ÏομεÏá½µ,
σὲ γνωÏίζω ἀπὸ τὴν ὄψη
ποὺ μὲ βία μετÏάει Ï„á½´ γῆ.
᾿Απ᾿ τὰ κόκκαλα βγαλμένη
τῶν ῾Ελλήνων Ï„á½° ἱεÏá½±
καὶ σὰν Ï€Ïῶτα ἀνδÏειωμένη
χαῖÏε, ὦ χαῖÏε, ᾿ΕλευθεÏιά!
> get-content test.txt -encoding utf8
Greek (in Polytonic):
The Greek anthem:
Σὲ γνωρίζω ἀπὸ τὴν κόψη
τοῦ σπαθιοῦ τὴν τρομερή,
σὲ γνωρίζω ἀπὸ τὴν ὄψη
ποὺ μὲ βία μετράει τὴ γῆ.
᾿Απ᾿ τὰ κόκκαλα βγαλμένη
τῶν ῾Ελλήνων τὰ ἱερά
καὶ σὰν πρῶτα ἀνδρειωμένη
χαῖρε, ὦ χαῖρε, ᾿Ελευθεριά!
>
答案2
浏览到此键:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Nls\CodePage
并更改OEMCP
为65001
。然后重新启动。修复此问题后,如果您使用的是 Consolas 字体,它似乎会将 PowerShell 锁定为小字体大小。cmd.exe
仍然工作正常。作为解决方法,您可以使用 Lucida Console,或者我切换到 Cascadia Mono: