在PowerShell中使用Python的Unicode?Windows中的替代终端?

3 投票
5 回答
4699 浏览
提问于 2025-04-15 18:16

我想要一个在Windows上支持Unicode的命令行工具。现在的PowerShell似乎不支持这个功能。

在PowerShell V2(Windows 7 64位)中:

PS C:\> powershell
Windows PowerShell
Copyright (C) 2009 Microsoft Corporation. All rights reserved.

PS C:\> python
Python 2.6.2 (r262:71605, Apr 14 2009, 22:46:50) [MSC v.1500 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> unicode_char=unichr(0xf12)
>>> unicode_char
u'\u0f12'
>>> print unicode_char
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "C:\python26\lib\encodings\cp437.py", line 12, in encode
    return codecs.charmap_encode(input,errors,encoding_map)
UnicodeEncodeError: 'charmap' codec can't encode character u'\u0f12' in position 0: character maps to <undefined>
>>>

我在使用PowerShell ISE时也得到了类似的结果,尽管网上有些地方说它支持Unicode之类的...

Python的集成开发环境(IDLE)2.6.2似乎运行得不错:

>>> unicode_char=unichr(0xf12)
>>> print unicode_char
༒
>>> 

不过IDLE运行得很慢,我更希望能用其他的命令行工具,有什么建议吗?我能在PowerShell中实现这个功能吗?

5 个回答

0

注意,在Windows控制台中输入 chcp 65001 时,字体必须是Lucida Console,而不能是任何位图字体。理论上,其他等宽的ttf字体应该可以用,但实际上并不行。这是因为微软在检查用于控制台的等宽字体时,有一些特定的属性,而Lucida Console包含了这些属性。

关于Python在Windows控制台中的unicode问题,至少有一个问题正在处理,详情可以在这里查看。

1

PowerShell本身是支持Unicode的,但传统的控制台在处理Unicode时会有一些问题。不过,PowerShell ISE绝对是支持Unicode的。

你可以试试这个:

PS C:\> $a = [char]0xf12
PS C:\> echo $a

这是Python不太好用。

你可以在启动Python之前试试输入 chcp 65001(这个命令是把编码设置为UTF-8)。不过我不能保证一定有效(我没有尝试过,因为这台机器上没有安装Python)。

6

Windows的控制台系统不是使用Unicode,而是基于代码页的。这意味着它使用特定的字符编码来显示文字。你可以尝试设置不同的代码页来看看效果:

PS> chcp 65001
PS> ipy64.exe
>>> print unichr(0x3a9)
Ω

我发现用代码页(0xF12)时,显示的字符不对。可能在其他代码页上能找到正确的字符。

ISE(集成脚本环境)可以显示Unicode字符,并且可以接受Unicode输入,比如:

PS> [char]0xf12
༒
PS> [char]0xe4
ä
PS> [char]0x3a9
Ω

不过,ISE似乎和IronPython解释器配合得不好。

另外,ISE似乎能够处理来自本地应用程序通过标准输出(stdout)发送的Unicode字符:

$src = @'
namespace Foo {
    public class Bar
    {
        public static void Baz()
        {
            System.Console.Out.WriteLine("\u0f12");
            System.Console.Out.WriteLine("\u00e4");
            System.Console.Out.WriteLine("\u03a9");
        }
    }
}
'@

Add-Type -TypeDefinition $src

[Foo.Bar]::Baz()
༒
ä
Ω

撰写回答