【问题标题】:Printing Unicode characters to the PowerShell prompt将 Unicode 字符打印到 PowerShell 提示符
【发布时间】:2011-08-13 08:55:37
【问题描述】:

我正在尝试设置 Mercurial 以打印出我当前使用 PowerShell 所在的存储库的状态。到目前为止,我一切正常,但是当我在存储库中时,我希望能够在提示符下打印“☿”。不幸的是,PowerShell 在打印 Unicode 字符方面似乎存在一些问题。

Is there a Windows command shell that will display Unicode characters? 的已接受答案中,建议 Windows 7 附带的 PowerShell v2(我正在使用)将能够打印 Unicode 字符,但我似乎不能让它工作。同样,使用chcp 65001 的下一个答案也不起作用。

这仍然是 PowerShell 的缺陷,还是我遗漏了一些明显的东西?

【问题讨论】:

  • 你能给出你想要提示的内容的硬拷贝,或者你想要用表格来提示的 unicode 代码吗?

标签: unicode windows-7 powershell mercurial


【解决方案1】:

这不是 PowerShell 的缺陷。这是 PowerShell.exe 使用的 Windows 控制台子系统的缺陷。控制台子系统不支持 Unicode,而是支持可追溯到 DOS 时代的代码页。 PowerShell V2 修复通过 PowerShell 集成脚本环境或 PowerShell_ISE.exe 提供。这是一个基于 WPF 的图形应用程序,可以轻松处理 Unicode 字符。

理论上您可以使用 chcp 或

更改代码页
[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding(850)

显示不同的字符,但我没有太多运气。您还需要找到包含您要显示的字符的代码页。

【讨论】:

  • 控制台支持Unicode,只是渲染支持不多。没有字体替换,没有复杂的脚本渲染等。好吧,使用 Raster 字体你又回到了 DOS 时代,但幸运的是 PowerShell 使用 TrueType 字体作为默认字体。
  • @Joey 你说它支持 unicode,但是它以什么方式比 cmd 更支持 unicode? chcp 1200 失败 chcp 1201 失败。所以不支持 16 位 unicode 代码页。您可以执行 chcp 65001 但显然这是有问题的,许多批处理文件和 C 程序都会因此而崩溃。它是没有 BOM 的 UTF-8。记事本无法在没有 BOM 的情况下以 UTF-8 创建文件。 type 即使使用代码页 65001(即没有 BOM 的 UTF-8)也能读取 UTF-16 LE w BOM 文件。我同意它可以在一定程度上与 unicode 一起使用,但支持似乎与 cmd 相同。
  • 控制台对整个 Unicode 范围的渲染有限,因为它没有使用 Uniscribe 或 DirectWrite。但这与 CMD 无关,它是一个 Unicode 应用程序。主要问题是 CMD 不支持 UTF BOM 在for /f 循环中设置批处理脚本或管道输出的编码。相反,它依赖于控制台的旧代码页,您可以通过 chcp.com 进行设置。对于遗留控制台应用程序(例如 3.6 之前的 python.exe),使用代码页 65001 (UTF-8) 可能有问题,因此您应该只为脚本中的选择行临时更改它(例如读取环境变量块)。
  • 我很惊讶有多少人将旧控制台应用程序中的问题归咎于 shell。程序不在 shell 中运行,我希望片刻的反思和检查进程列表会导致人们理解控制台和终端是与 shell 分开的资源。无论如何,由于 Mercurial 是一个 Python 应用程序,我假设一旦它使用 Python 3.6+,它将不再默认使用控制台的旧代码页 API。我们在 Python 开发社区中花了很长时间来解决这个问题。我认为这个问题持续了十年。
【解决方案2】:

在这里打印半精细。 Consolas 没有该字符的字形,所以我在控制台窗口中看到的只是替换字形。但是 PowerShell 接受并打印它就好了,正如您在复制粘贴时看到的那样。

现在,如果您已将控制台窗口设置为光栅字体,那么情况会有所不同,但幸运的是 PowerShell 有健全的默认设置。

【讨论】:

    【解决方案3】:

    您不能使用默认的 PowerShell(即 Windows)控制台。但是,如果您使用PowerShell ISE(它提供了自己的控制台),它将起作用。不过,我不确定这是否能满足您的需求。

    【讨论】:

      【解决方案4】:

      Deja Vu Sans Mono 在 cmd 中工作并具有该字符,因此它也可以在 PowerShell 中工作。

      顺便说一句,我建议还在命令提示符下安装 Droid Sans Mono 和 Courier New。然后它们也将在 PowerShell 中可用。 cmd 支持的单行距字体并不多。但那是三个,Deja Sans Mono、Droid Sans Mono 和 Courier New。

      【讨论】:

        【解决方案5】:

        你需要

        1. 在您的系统中安装一个monospace font,其中包含您的字形(可能使用字符映射来找到一个合适的,等等) 然后
        2. 将其设置为控制台字体,如下所述:http://www.watchingthenet.com/how-to-add-and-change-fonts-in-windows-command-prompt.html

        【讨论】:

        • 字符映射不会帮助找到要在系统上安装的字体,因为它只显示系统上的字体。 babelmap 将扫描您系统上的所有字体,但仍然只扫描系统上的字体。如果您的系统上已经有字体,那很好。但我不认为有那个字形。很久以前,我查看了可以在 cmd 提示符下安装哪些字体,我遇到了 3.. 一个是 Deja Vu Sans Mono,它有他的性格。看我的回答。
        猜你喜欢
        • 1970-01-01
        • 2015-05-30
        • 2014-08-23
        • 2018-06-22
        • 1970-01-01
        • 2013-06-01
        相关资源
        最近更新 更多