我在WinXP 5.1.2600上工作,编写一个涉及汉语拼音的Python应用程序,这让我陷入了无尽的Unicode问题。切换到Python 3.0解决了其中的许多问题。但是由于一些奇怪的原因,控制台输出的print()函数不支持Unicode。下面是一个小程序。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
print('sys.stdout encoding is "' + sys.stdout.encoding + '"')
str1 = 'lüelā'
print(str1)
输出为(将尖括号改为方括号以便于阅读):
sys.stdout encoding is "cp1252"
Traceback (most recent call last):
File "TestPrintEncoding.py", line 22, in [module]
print(str1)
File "C:\Python30\lib\io.py", line 1491, in write
b = encoder.encode(s)
File "C:\Python30\lib\encodings\cp1252.py", line 19, in encode
return codecs.charmap_encode(input,self.errors,encoding_table)[0]
UnicodeEncodeError: 'charmap' codec can't encode character '\u0101'
in position 4: character maps to [undefined]
注意ü = '\xfc'
= 252
没有问题,因为它是高ASCII码。但是ā = '\u0101'
超过8位。
有人知道如何将sys.stdout
的编码更改为'utf-8'
吗?请记住,Python 3.0不再使用codecs
模块,如果我正确理解文档的话。
(Note“coding:”行指定的编码是 source code 的编码,而不是控制台输出的编码。但是谢谢你的想法!)
5条答案
按热度按时间gstyhher1#
Windows命令提示符(cmd.exe)无法显示您正在使用的Unicode字符,即使Python在内部以正确的方式处理它。您需要使用IDLE、Cygwin或其他可以正确显示Unicode的程序。
请参阅此线程以获得完整的解释:http://www.nabble.com/unable-to-print-Unicode-characters-in-Python-3-td21670662.html
jucafojl2#
您可能想尝试将环境变量“PYTHONIOENCODING”更改为“utf_8”。
elcex8rz3#
看看here的问题和答案,我认为他们有一些有价值的线索。特别是,注意
sys
模块中的setdefaultencoding
,但也注意到你可能不应该使用它。bq3bfh9z4#
这里有一个肮脏的黑客:
然而,一切都打破了它:
但是可以用cmd的echo打印:
这里有一个简单的方法来实现这个跨平台:
但窗口的
echo
尾随空行不能被抑制。x33g5p2x5#
在Windows中用Python显示Unicode字符的问题是已知的。目前还没有官方的解决方案。正确的做法是使用winapi函数WriteConsoleW。构建一个工作解决方案是不平凡的,因为还有其他相关问题。然而,我已经开发了一个软件包,试图解决Python的这个问题。参见https://github.com/Drekin/win-unicode-console。你也可以在那里阅读关于这个问题的更深入的解释。该软件包也在pypi(https://pypi.python.org/pypi/win_unicode_console)上,可以使用pip安装。