问题 使用控制台让python在Windows XP上以UTF8进行打印


我想在Windows XP上配置我的控制台以支持UTF8并让python检测并使用它。

到目前为止,我的尝试:

C:\Documents and Settings\Philippe>C:\Python25\python.exe
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> print u'é'
é
>>> import sys
>>> sys.stdout.encoding
'cp437'
>>> quit()

所以,默认情况下我在cp437并且python检测到就好了。

C:\Documents and Settings\Philippe>chcp 65001
Active code page: 65001

C:\Documents and Settings\Philippe>python
Python 2.5.2 (r252:60911, Feb 21 2008, 13:11:45) [MSC v.1310 32 bit (Intel)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> sys.stdout.encoding
'cp65001'
>>> print u'é'
C:\Documents and Settings\Philippe>

好像用UTF8打印让python崩溃了......


4716
2017-08-10 16:34


起源

是什么让你认为你首先在这里打印utf8? - Piotr Dobrogost
我刚刚更新了我的答案 - 这是在Python 3.3中添加的。 - Mark Ransom
也可以看看: stackoverflow.com/a/30505612/788700 - Adobe


答案:


我想在Windows XP上配置我的控制台以支持UTF8

我不认为这会发生。

65001代码页是错误的;一些stdio调用行为不正确并打破了许多工具。您可以手动将cp65001注册为编码:

def cp65001(name):
    if name.lower()=='cp65001':
        return codecs.lookup('utf-8')

codecs.register(cp65001)

这可以让你 print u'some unicode string',它不允许您在该Unicode字符串中写入非ASCII字符。当您尝试将非ASCII UTF-8序列直接写为字节字符串时,您会得到相同的奇怪错误(IOError 0等)。

不幸的是,UTF-8是Windows下的二等公民。 NT的Unicode模型是在UTF-8存在之前制定的,因此你需要在任何你想要一致的Unicode的地方使用每个代码单元编码两个字节(UTF-16,最初是UCS-2)。使用字节字符串,就像许多便携式应用程序和用C语言编写的语言(如Python)一样 stdio,不适合那种模式。

重写Python以使用Windows Unicode控制台调用(如WriteConsoleW)而不是便携式C stdio调用不能很好地处理像管道和重定向到文件的shell技巧。 (更不用说你仍然需要从默认终端字体更改为TTF,然后才能看到结果正常工作......)

最终,如果您需要一个支持基于stdio的应用程序的UTF-8支持的命令行,您可能最好使用故意支持它的Windows控制台的替代方案,例如Cygwin,或Python的IDLE或pywin32的PythonWin。


8
2017-08-10 21:36



好的,然后我会更好地学习使用cp437然后...... - Philippe F


当我在Python 2.7上尝试相同的事情时,我得到一个错误 import sys

LookupError:未知编码:cp65001

这对我来说意味着Python不知道如何使用特殊的Windows UTF-8代码页,并且2.5非常不妥当地处理了这种情况。

显然,这是调查和  在Python 3.2中修复: http://bugs.python.org/issue6058

更新: 在 Python 3.3中的新功能 它列出 cp65001 支持作为一项新功能。


4
2017-08-10 17:22



不,Python 3.2崩溃了 chcp 65001 也是活跃的。该特定问题已被视为无效,未修复。 - Mark Tolonen
@Mark Tolonen,感谢您的更新。显然,我的阅读理解能力需要提高。 - Mark Ransom


我在使用Windows Vista的Python脚本中在cmd控制台中显示欧元符号时遇到问题。这对我有用:

拳头,我需要确保字体设置为 Lucinda Console 而不是不起作用的光栅字体。这可以通过在控制台窗口的下拉菜单中设置控制台的默认属性并使用重新启动控制台窗口来完成 cmd.exe

其次,当我运行cmd时,我设置了代码页 chcp 1252

第三,我确保我的编辑器(Notepad ++)具有正确的编码设置。在 Encoding 在Notepad ++中选择下拉菜单 Encode in UTF-8

这对我有用。


0
2018-05-31 14:32





在你的胜利中设置这个:

set PYTHONIOENCODING=utf-8

0
2018-05-18 03:00