如何在python中显示非英文字符?

时间:2011-11-27 19:56:31

标签: python encoding dictionary character-encoding ascii

我有一个python字典,其中包含非英文字符的项目。当我打印字典时,python shell不能正确显示非英文字符。我该如何解决这个问题?

4 个答案:

答案 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.

解释了一些事情。