将Unicode字符打印到PowerShell提示符

将Unicode字符打印到PowerShell提示符,unicode,windows-7,powershell,mercurial,Unicode,Windows 7,Powershell,Mercurial,我正在尝试设置Mercurial以打印出我当前使用PowerShell的存储库的状态。到目前为止,我的一切都正常,但我希望能够打印'☿' 当我在存储库中时,返回提示。不幸的是,PowerShell似乎在打印Unicode字符方面存在一些问题 在接受的答案中,有人建议Windows7(我正在使用)附带的PowerShell v2能够打印Unicode字符,但我似乎无法让它工作。同样,使用chcp 65001的下一个答案也不起作用 这仍然是PowerShell中的一个缺陷,还是我遗漏了一些明显的东西

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

在接受的答案中,有人建议Windows7(我正在使用)附带的PowerShell v2能够打印Unicode字符,但我似乎无法让它工作。同样,使用chcp 65001的下一个答案也不起作用


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

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

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

理论上,您可以使用chcp或

[Console]::OutputEncoding = [System.Text.Encoding]::GetEncoding(850)

显示不同的角色,但我在这方面运气不太好。您还需要找到包含要显示的字符的代码页。

在此处打印半精细。ConsoleAS没有该字符的标志符号,因此我在console窗口中看到的只是一个替换标志符号。但是PowerShell可以很好地接受并打印它,正如您在复制粘贴时看到的那样

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

您需要

  • 在系统中安装包含字形的
    monospace字体
    (可能使用字符映射找到合适的字体,等等) 然后
  • 将其设置为控制台字体,如下所述:

  • Deja Vu Sans Mono在cmd中工作,并具有该特性,因此它也在PowerShell中工作


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

    控制台支持Unicode,只是渲染支持不多。没有字体替换,没有复杂的脚本渲染,等等。使用光栅字体,您又回到了DOS时代,但PowerShell幸运地使用了TrueType字体作为默认字体。@Joey您说它支持unicode,但它在哪些方面比cmd更支持unicode<代码>chcp 1200失败
    chcp 1201
    失败。因此不支持16位unicode代码页。您可以使用CHCP65001,但显然这是一个错误,许多批处理文件和C程序都会随之崩溃。它是UTF-8,没有BOM。记事本无法在没有BOM的UTF-8中创建文件<代码>类型即使使用代码页65001(即不带BOM的UTF-8),也能读取UTF-16 LE w BOM文件。我同意它可以在一定程度上与unicode一起工作,但是它的支持似乎与cmd相同。由于控制台不使用Uniscribe或DirectWrite,因此它限制了整个unicode范围的呈现。但这与CMD无关,后者是一个Unicode应用程序。主要问题是CMD不支持UTF BOMs在
    for/f
    循环中设置批处理脚本或管道输出的编码。相反,它依赖于控制台的遗留代码页,您可以通过chcp.com进行设置。使用代码页65001(UTF-8)对于旧式控制台应用程序(例如3.6之前的python.exe)可能会有问题,因此您应该仅对脚本中的选定行进行临时更改(例如读取环境变量块)。有多少人将旧式控制台应用程序中的问题归咎于shell,这让我感到惊讶。程序不是在shell中运行的,我希望通过对进程列表的思考和检查,人们会明白控制台和终端是与shell分开的资源。无论如何,由于Mercurial是一个Python应用程序,我假设一旦它使用了Python3.6+,它将不再默认使用控制台的遗留代码页API。我们在Python开发社区花了太长时间才解决这个问题。我认为这个问题已经持续了十年。你能提供一份你想要提示的内容的硬拷贝,或者你想要用一个表及其表示形式提示的unicode代码吗?字符映射将无助于找到要安装在系统上的字体,因为它只显示你系统上的字体。babelmap将扫描系统上的所有字体,但仍仅扫描系统上的字体。。如果系统上已经有字体,则可以。。但我不认为有这样的铭文。很久以前,我研究了可以在cmd提示符上安装哪些字体,我遇到了3。。一个是似曾相识,这就是他的性格。看看我的答案。