我有一个Python字典,其中包含具有非英文字符的项。当我打印字典时,Python shell无法正确显示非英文字符。我该怎么解决这个问题?
我有一个Python字典,其中包含具有非英文字符的项。当我打印字典时,Python shell无法正确显示非英文字符。我该怎么解决这个问题?
当你的应用程序打印 hei\xdfen
而不是 heißen
时,这意味着你实际上没有打印实际的 Unicode 字符串,而是打印了 Unicode 对象的字符串表示。
假设你的字符串 ("heißen") 存储在名为 text
的变量中。为了确保你所在的位置,请调用以下代码检查此变量的类型:
>>> type(text)
<type 'unicode'>
,这意味着你处理的不是一个字符串,而是一个unicode
对象。print(text)
来打印文本,你将无法得到实际文本("heißen"),而是一个unicode对象的字符串表示。
要解决这个问题,你需要知道终端所使用的编码,并根据给定的编码对你的unicode对象进行编码并打印出来。text.encode('utf-8')
以上是基本概念,现在让我给你举一个更详细的例子。我们假设有一个存储你的字典的源代码文件,像这样:
mydict = {'heiße': 'heiße', 'äää': 'ööö'}
print mydict
时,你会得到{'\xc3\xa4\xc3\xa4\xc3\xa4': '\xc3\xb6\xc3\xb6\xc3\xb6', 'hei\xc3\x9fe': 'hei\xc3\x9fe'}
。即使print mydict['äää']
也不起作用:它会导致类似于├Â├Â├Â
的结果。问题的本质可以通过尝试print type(mydict['äää'])
来揭示,这将告诉您正在处理一个string
对象。print unicode(mydict, 'utf-8')
print unicode(mydict, 'utf-8').encode('utf-8')
外部编码方法指定了根据你的终端的编码方式。
我非常强烈建议您仔细阅读Joel的“关于Unicode和字符集,每个软件开发人员绝对必须知道的最低限度(没有任何借口!)”。除非您理解字符集的工作原理,否则您将一次又一次地遇到类似于这样的问题。
>>> a = "heißen"
>>> a
'hei\xc3\x9fen'
>>> a.encode("utf-8")
Traceback (most recent call last):
File "", line 1, in
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 3: ordinal not in range(128)
- alwbtcu
表示我们正在处理一个 unicode
对象,\xdf
代表 ß 的 Unicode 代码点。 - jsalonenunicode
和 string
对象之间的区别。不存在所谓的原始文本:如果你在源代码中“刚刚写入”德语单词,它们将继承你指定给源代码文件的编码,并且你必须进行相应的转换。我正在我的答案中添加一些细节 - 请耐心等待 :) - jsalonen实际上,这并不是一个与Python相关的问题。
您的环境变量(我假设您在Linux或Mac上)应该激活UTF-8字符编码。
您应该能够将这些放入您的~/.profile(或~/.bashrc)文件中:
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8
-edit-
其实,Mac默认使用UTF-8编码。这是一个Windows/Linux的问题。-edit 2-
当然,您应该始终使用Unicode字符串、Unicode编辑器和Unicode文档类型。但我假设您已经知道了这一点 :-)# -*- coding: utf-8 -*-
- Tom van der Woerdt/u
标志启动cmd
,例如:cmd /u
(在开始菜单->运行中输入)。这将启动一个Unicode(UTF-16)会话。现在让我们希望Python知道这一点 :-) - Tom van der WoerdtPython 3.0拥有默认的Unicode字符串,而在Python 2.x中,您需要在字符串前加上u。
u"汉字/漢字 chinese"
>>> "heißen"
is equivalent to
>>> print repr("heißen")
Python 2中有关repr的文档http://docs.python.org/2/library/functions.html#func-repr相对较少。
可以看到,两者都给出了字节串“heißen”的“基于字节”的表示形式,其中所有大于127的字节都被编码为\x。这就是你得到的结果。
'hei\xc3\x9fen'
repr()函数对于Unicode字符的显示并不是很有帮助。它可以正确地将 'ß' 显示为单个Unicode字符 '\xdf',但仍然难以阅读。
我发现一个实用的解决方案是使用Python 3。
http://docs.python.org/3/library/functions.html#repr
页面还显示
ascii(object)
As repr(), return a string containing a printable representation of an
object, but escape the non-ASCII characters in the string returned by
repr() using \x, \u or \U escapes. This generates a string similar to
that returned by repr() in Python 2.
这有点解释了事情。