我正在使用WinXP 5.1.2600,编写一个涉及中文拼音的Python应用程序,这让我遇到了无数的Unicode问题。切换到Python 3.0已经解决了许多问题。但是由于一些奇怪的原因,控制台输出的print()函数不支持Unicode。这是一个很小的计划。
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
模块。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
不幸的是,“coding:”行指定的编码是源代码的编码,而不是控制台输出的编码。但是谢谢你的想法!
答案 0 :(得分:15)
Windows命令提示符(cmd.exe)无法显示您正在使用的Unicode字符,即使Python在内部以正确的方式处理它。您需要使用IDLE,Cygwin或其他可以正确显示Unicode的程序。
请参阅此主题以获取完整说明: http://www.nabble.com/unable-to-print-Unicode-characters-in-Python-3-td21670662.html
答案 1 :(得分:12)
您可能想尝试将环境变量“PYTHONIOENCODING”更改为“utf_8”。我写了page on my ordeal with this problem。
答案 2 :(得分:2)
查看问题和回答here,我认为他们有一些有价值的线索。具体来说,请注意sys
模块中的setdefaultencoding
,以及您可能不应该使用它的事实。
答案 3 :(得分:1)
在Windows中以Python显示Unicode字符的问题是众所周知的。还没有正式的解决方案。正确的做法是使用winapi函数WriteConsoleW。由于存在其他相关问题,因此构建工作解决方案并不重要。但是,我已经开发了一个包,试图修复Python关于这个问题。见https://github.com/Drekin/win-unicode-console。您还可以在那里阅读有关该问题的更深入的解释。该软件包也位于pypi(https://pypi.python.org/pypi/win_unicode_console)上,可以使用pip进行安装。
答案 4 :(得分:1)
这是一个肮脏的黑客:
# works
import os
os.system("chcp 65001 &")
print("юникод")
然而一切都破了:
简单静音第一行已打破它:
# doesn't work
import os
os.system("chcp 65001 >nul &")
print("юникод")
检查操作系统类型会破坏它:
# doesn't work
import os
if os.name == "nt":
os.system("chcp 65001 &")
print("юникод")
在if block下它甚至不起作用:
# doesn't work
import os
if os.name == "nt":
os.system("chcp 65001 &")
print("юникод")
但是可以用cmd的回声打印:
# works
import os
os.system("chcp 65001 & echo {0}".format("юникод"))
这是制作这种跨平台的简单方法:
# works
import os
def simple_cross_platrofm_print(obj):
if os.name == "nt":
os.system("chcp 65001 >nul & echo {0}".format(obj))
else:
print(obj)
simple_cross_platrofm_print("юникод")
但窗口的echo
尾随空行无法被抑制。