当我尝试在Windows控制台中打印Unicode字符串时,出现UnicodeEncodeError: 'charmap' codec can't encode character ....错误.我认为这是因为Windows控制台不接受仅Unicode字符.最好的方法是什么??在这种情况下,有什么方法可以让Python自动打印而不是失败?
编辑: 我正在使用Python 2.5.
注意: @ LasseV.Karlsen回答带有复选标记有点过时(从2008年开始).请谨慎使用下面的解决方案/答案/建议!!
截至今天(2016年1月6日),@ JFSebastian答案更为相关.
我正在运行一个最新的Linux系统,我的所有语言环境都是UTF-8:
LANG=de_DE.UTF-8
LANGUAGE=
LC_CTYPE="de_DE.UTF-8"
LC_NUMERIC="de_DE.UTF-8"
LC_TIME="de_DE.UTF-8"
...
LC_IDENTIFICATION="de_DE.UTF-8"
LC_ALL=
Run Code Online (Sandbox Code Playgroud)
现在我想将UTF-8编码的内容写入控制台.
现在Python使用UTF-8进行FS编码,但坚持使用ASCII作为默认编码:-(
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.getfilesystemencoding()
'UTF-8'
Run Code Online (Sandbox Code Playgroud)
我认为最好(干净)的方法是设置PYTHONIOENCODING环境变量.但似乎Python忽略了它.至少在我的系统上ascii,即使在设置envvar之后,我仍然保持默认编码.
# tried this in ~/.bashrc and ~/.profile (also sourced them)
# and on the commandline before running python
export PYTHONIOENCODING=UTF-8
Run Code Online (Sandbox Code Playgroud)
如果我在脚本开头执行以下操作,它可以工作:
>>> import sys
>>> reload(sys) # to enable `setdefaultencoding` again
<module 'sys' (built-in)>
>>> sys.setdefaultencoding("UTF-8")
>>> sys.getdefaultencoding()
'UTF-8'
Run Code Online (Sandbox Code Playgroud)
但这种做法似乎不洁净.那么,实现这一目标的好方法是什么?
而不是更改默认编码 - 这不是一个好主意(请参阅mesilliac的答案) - 我只是sys.stdout用StreamWriter …
我对 python 很陌生,对这种编码的东西很困惑。到目前为止,我已经阅读了以下类型的“编码”:
import sys
import locale
print (sys.stdout.encoding)
print (locale.getpreferredencoding())
print (sys.getdefaultencoding())
Run Code Online (Sandbox Code Playgroud)
输出:
utf8
cp1252
utf-8
Run Code Online (Sandbox Code Playgroud)
有什么不同?
在Python 2中,该函数json.dumps()将确保将所有非ascii字符转义为\uxxxx.
但这不是很混乱,因为它\uxxxx是一个unicode字符,应该在unicode字符串中使用.
输出json.dumps()是a str,它是Python 2中的字节字符串.因此它不应该将字符转义为\xhh?
>>> unicode_string = u"\u00f8"
>>> print unicode_string
ø
>>> print json.dumps(unicode_string)
"\u00f8"
>>> unicode_string.encode("utf8")
'\xc3\xb8'
Run Code Online (Sandbox Code Playgroud)