更改 OutputEncoding 和代码页

更改 OutputEncoding 和代码页

我在使用 PowerShell 获取 Unicode 输出时遇到了一些问题,我使用以下方法部分解决了该问题:

[Console]::OutputEncoding = [Text.Encoding]::UTF8

但是我注意到这个设置有问题。如果我运行如下命令:

Get-Content a.txt

它不以 UTF8 输出。原因似乎是这样的:

默认使用与系统活动代码页 (通常为 ANSI) 相对应的编码。

https://docs.microsoft.com/powershell/module/microsoft.powershell.management/get-content?view=powershell-5.1

那么如果[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

并更改OEMCP65001。然后重新启动。修复此问题后,如果您使用的是 Consolas 字体,它似乎会将 PowerShell 锁定为小字体大小。cmd.exe 仍然工作正常。作为解决方法,您可以使用 Lucida Console,或者我切换到 Cascadia Mono:

https://github.com/microsoft/cascadia-code

相关内容