当我尝试在Windows控制台中打印Unicode字符串时,出现UnicodeEncodeError: 'charmap' codec can't encode character ....错误.我认为这是因为Windows控制台不接受仅Unicode字符.最好的方法是什么??在这种情况下,有什么方法可以让Python自动打印而不是失败?
编辑: 我正在使用Python 2.5.
注意: @ LasseV.Karlsen回答带有复选标记有点过时(从2008年开始).请谨慎使用下面的解决方案/答案/建议!!
截至今天(2016年1月6日),@ JFSebastian答案更为相关.
首先,我将Windows CMD编码更改为utf-8并运行Python解释器:
chcp 65001
python
Run Code Online (Sandbox Code Playgroud)
然后我尝试在其中打印一个unicode sting,当我这样做时,Python以一种特殊的方式崩溃(我只是在同一个窗口中得到一个cmd提示符).
>>> import sys
>>> print u'ëèæîð'.encode(sys.stdin.encoding)
Run Code Online (Sandbox Code Playgroud)
任何想法为什么会发生以及如何使它工作?
UPD:sys.stdin.encoding退货'cp65001'
UPD2:我刚才发现这个问题可能与utf-8使用多字节字符集这一事实有关(kcwu就此提出了一个很好的观点).我尝试使用'windows-1250'运行整个示例并得到'ëea?'.Windows-1250使用单字符集,因此它适用于它理解的字符.但是我仍然不知道如何让'utf-8'在这里工作.
UPD3:哦,我发现它是一个已知的Python bug.我想会发生的事情是Python将cmd编码复制为'cp65001到sys.stdin.encoding并尝试将其应用于所有输入.由于它无法理解'cp65001',因此它会在包含非ascii字符的任何输入上崩溃.
我知道之前已经问过这样的问题了.但我找不到解决方案.
我想在子程序模块中使用我的python文件中定义的unicode文字.但我没有得到我需要的结果.例如以下代码
# -*- coding: utf-8 -*-
import sys
import codecs
import subprocess
cmd = ['echo', u'??']
new_cmd = []
for c in cmd:
if isinstance(c,unicode):
c = c.encode('utf-8')
new_cmd.append(c)
subprocess.call(new_cmd)
Run Code Online (Sandbox Code Playgroud)
打印出来
ä½ å¥½
Run Code Online (Sandbox Code Playgroud)
如果我将代码更改为
# -*- coding: utf-8 -*-
import sys
import codecs
import subprocess
cmd = ['echo', u'??']
new_cmd = []
for c in cmd:
if isinstance(c,unicode):
c = c.encode(sys.getfilesystemencoding())
new_cmd.append(c)
subprocess.call(new_cmd)
Run Code Online (Sandbox Code Playgroud)
我得到以下内容
??
Run Code Online (Sandbox Code Playgroud)
在这个阶段,我只能假设我反复犯了一个简单的错误.但我很难弄清楚它是什么.当通过python的子进程调用时,如何获得echo以打印出以下内容
??
Run Code Online (Sandbox Code Playgroud)
编辑:
Python的版本是2.7.我在Windows 8上运行,但我希望解决方案与平台无关.
我使用cmd Windows,chcp 65001,这是我的代码:
print u'\u0110 \u0110' + '\n'
Run Code Online (Sandbox Code Playgroud)
结果:
(a character cmd can't display) (character what i want)
Traceback (most recent call last):
File "b.py", line 26, in <module>
print u'\u0110 \u0110'
IOError: [Errno 2] No such file or directory
Run Code Online (Sandbox Code Playgroud)
但是,当我使用这段代码时:
print u' \u0110 \u0110' + '\n'
Run Code Online (Sandbox Code Playgroud)
结果:
(a space)(charecter what i want) (character what i want)
Traceback (most recent call last):
File "b.py", line 26, in <module>
print u' \u0110 \u0110' + '\n'
IOError: [Errno 2] No such file …Run Code Online (Sandbox Code Playgroud)