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

5

我有一个Python字典,其中包含具有非英文字符的项。当我打印字典时,Python shell无法正确显示非英文字符。我该怎么解决这个问题?


1
你能给一个例子吗? - rubik
你了解字符编码吗?即使你认为你已经知道了,但你应该阅读软件开发人员绝对必须知道的Unicode和字符集绝对最低限度才能进一步学习。 - user395760
这对我来说听起来似乎不是Python的问题,而是你的终端应用程序的问题。你使用的是Linux、Windows还是OSX?我会假设这些操作系统的所有标准命令行都默认显示非英文字符,但情况可能并非如此。这可能只是选择正确的字体与你的shell一起使用的问题。 - RLH
例如:“heißen”变成“hei\xdfen”。 - alwbtc
4个回答

7

当你的应用程序打印 hei\xdfen 而不是 heißen 时,这意味着你实际上没有打印实际的 Unicode 字符串,而是打印了 Unicode 对象的字符串表示。

假设你的字符串 ("heißen") 存储在名为 text 的变量中。为了确保你所在的位置,请调用以下代码检查此变量的类型:

>>> type(text)

如果得到的是<type 'unicode'>,这意味着你处理的不是一个字符串,而是一个unicode对象。
如果你试图通过调用print(text)来打印文本,你将无法得到实际文本("heißen"),而是一个unicode对象的字符串表示要解决这个问题,你需要知道终端所使用的编码,并根据给定的编码对你的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')

外部编码方法指定了根据你的终端的编码方式。

我非常强烈建议您仔细阅读Joel的“关于Unicode和字符集,每个软件开发人员绝对必须知道的最低限度(没有任何借口!)”。除非您理解字符集的工作原理,否则您将一次又一次地遇到类似于这样的问题。


1
我做了以下操作:>>> 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) - alwbtc
尝试 >>> a = u"hei\xdfen",其中 u 表示我们正在处理一个 unicode 对象,\xdf 代表 ß 的 Unicode 代码点。 - jsalonen
我不想这样做,因为我在Python字典中写了很多德语单词。现在我无法正确地将它们打印到屏幕上。 - alwbtc
这并不像你想象的那么简单。为了让你的代码起作用,你真的需要非常了解 unicodestring 对象之间的区别。不存在所谓的原始文本:如果你在源代码中“刚刚写入”德语单词,它们将继承你指定给源代码文件的编码,并且你必须进行相应的转换。我正在我的答案中添加一些细节 - 请耐心等待 :) - jsalonen

4

实际上,这并不是一个与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文档类型。但我假设您已经知道了这一点 :-)

我使用的是Windows Python 2.7,如何使用UTF-8编码? - alwbtc
使用utf-8文档类型作为源应该足够了,据我所知。只需将以下内容放在文件顶部:# -*- coding: utf-8 -*- - Tom van der Woerdt
尝试使用/u标志启动cmd,例如:cmd /u(在开始菜单->运行中输入)。这将启动一个Unicode(UTF-16)会话。现在让我们希望Python知道这一点 :-) - Tom van der Woerdt
我理解你的观点,但说实话,这不仅仅是一个Windows/Linux问题。这是关于理解Python中Unicode对象如何工作以及默认设置如何影响看似简单程序行为的问题。不过,这些是很好的提示! - jsalonen

1

Python 3.0拥有默认的Unicode字符串,而在Python 2.x中,您需要在字符串前加上u。

u"汉字/漢字 chinese"  

1
在Python终端中,
    >>> "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.

这有点解释了事情。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接