我有一个python字典,其中包含非英文字符的项目。当我打印字典时,python shell不能正确显示非英文字符。我该如何解决这个问题?
答案 0 :(得分:6)
当您的应用程序打印hei\xdfen
而不是heißen
时,这意味着您实际上并未打印实际的unicode字符串,而是打印在unicode对象的字符串表示形式上。
让我们假设您的字符串(“heißen”)存储在名为text
的变量中。只是为了确定你所在的位置,通过调用:
>>> type(text)
如果你得到<type 'unicode'>
,则表示你没有处理字符串,而是处理unicode
对象。
如果您执行直观的操作并尝试通过调用print(text)
来打印文本,您将无法获得实际文本(“heißen”),而是一个unicode对象的字符串表示< / em>的
要解决此问题,您需要知道您的终端具有哪种编码并打印出根据给定编码编码的unicode对象。
例如,如果您的终端使用UTF-8编码,您可以通过调用打印出一个字符串:
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
对象。
为了解决这个问题,首先需要将源代码文件的字符串中的字符串表示解码为unicode对象,然后将其表示在终端的字符集中。对于个别字典项目,可以通过以下方式获得:
print unicode(mydict, 'utf-8')
请注意,如果默认编码不适用于您的终端,则需要写:
print unicode(mydict, 'utf-8').encode('utf-8')
外部编码方法根据您的终端指定编码。
我真的非常恳请你阅读乔尔的"The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)"。除非您了解字符集的工作原理,否则您将一次又一次地遇到与此类似的问题。
答案 1 :(得分:1)
实际上,这不是与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 doctype。但我假设你知道: - )
答案 2 :(得分:1)
Python 3.0具有默认的unicode字符串,在python 2.x中,您必须使用字符串whit u
作为前缀u"汉字/漢字 chinese"
答案 3 :(得分:1)
在python终端中,
>>> "heißen"
is equivalent to
>>> print repr("heißen")
python 2中关于repr的Python文档 http://docs.python.org/2/library/functions.html#func-repr 很糟糕。
可以看出,两者都给出了字节串“heißen”的'基于字节'的表示,其中所有大于127的字节都是\ x编码的。这是你从哪里来的
'hei\xc3\x9fen'
unicode的repr()没有多大帮助。它正确地将'ß'显示为单个unincode cherecter'\ 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.
解释了一些事情。