如何在Python中打印Unicode字符?

174

我想制作一个词典,其中英语单词指向俄语和法语翻译。

在Python中如何打印Unicode字符?另外,如何将Unicode字符存储在变量中?


这个有帮助吗:http://docs.python.org/howto/unicode.html - paulsm4
请在这里查看。在您的字符串前加上 u,允许Python将其视为Unicode字符串字面值。 - S.R.I
10个回答

167

要在Python源代码中包含Unicode字符,您可以在字符串中使用形式为\u0123Unicode转义字符。在Python 2.x中,您还需要在字符串文字前加上'u'。

以下是在Python 2.x交互式控制台中运行的示例:

>>> print u'\u0420\u043e\u0441\u0441\u0438\u044f'
Россия
在Python 2中,字符串前缀'u'表示它们是Unicode类型变量,详见Python Unicode文档。在Python 3中,'u'前缀现在是可选的:
>>> print('\u0420\u043e\u0441\u0441\u0438\u044f')
Россия

如果按照上述命令运行并不能正确地显示文本,那么可能是您的终端不支持显示Unicode字符。

这些示例使用Unicode转义符(\u...),允许您在保持源代码为普通ASCII的同时打印Unicode字符。当在不同的系统上使用相同的源代码时,这可以提供帮助。 如果您确信所有系统都正确处理Unicode文件,则还可以直接在Python源代码中使用Unicode字符(例如,在Python 2中输入print u'Россия'),。

有关从文件中读取Unicode数据的信息,请参见此答案:

在Python中从文件读取字符


4
是的,你可以用Unicode编码的文本文件编写代码,但许多编辑器和工具在处理它们时会遇到麻烦。我在不同平台上处理源代码的经验是最好将源代码保持为ASCII,并使用Unicode转义。 - Matt Ryall
3
@MattRyall,我同意,但是一支由俄罗斯开发人员组成的团队可能希望以俄语编写注释和文档字符串。对于语言项目来说,这是一个不错的选择。 - Johan Lundberg
3
请注意,这只适用于打印纯字符串。如果字符串包装在其他对象中,则会出现转义码。例如,请尝试使用“print [u'\u0420\u043e\u0441\u0441\u0438\u044f']”。 - btubbs
3
如果我把它存储到一个名为mystr的字符串中,那么如何打印它? - ZK Zhao
1
@CarloWood 这个最佳答案恰好告诉了你想要的。只需print your_unicode_characters.encode('utf-8')即可。 - Yuhao Zhang
显示剩余4条评论

53

在Python中打印unicode字符:

直接从Python解释器中打印unicode字符:

el@apollo:~$ python
Python 2.7.3
>>> print u'\u2713'

Unicode字符u'\u2713'是一种勾号。解释器会在屏幕上显示勾号。

从Python脚本中打印出Unicode字符:

将以下代码放入test.py文件中:

#!/usr/bin/python
print("here is your checkmark: " + u'\u2713');

按照以下方式运行:

el@apollo:~$ python test.py
here is your checkmark: 

如果你看不到勾号,那么问题可能出现在其他地方,比如终端设置或者你正在进行的流重定向操作。

将Unicode字符保存到文件中:

将以下内容保存到文件foo.py中:

#!/usr/bin/python -tt
# -*- coding: utf-8 -*-
import codecs
import sys 
UTF8Writer = codecs.getwriter('utf8')
sys.stdout = UTF8Writer(sys.stdout)
print(u'e with obfuscation: é')

运行它并将输出导入文件:

python foo.py > tmp.txt

打开tmp.txt并查看其中的内容,你会看到:

el@apollo:~$ cat tmp.txt 
e with obfuscation: é

因此,你已经将带有混淆标记的Unicode字符e保存到文件中。


@ofer.sheffer 奇怪的是,我在这里寻求解决相反的问题,这意味着可能需要一些摆弄。 - Chris H

47
如果您尝试使用print()打印Unicode,并且出现ascii编解码错误,请查看this page,其中TLDR是在启动Python之前执行export PYTHONIOENCODING=UTF-8(该变量控制控制台尝试将字符串数据编码为字节序列)。在内部,默认情况下,Python3使用UTF-8(请参见the Unicode HOWTO),因此这不是问题。您可以将Unicode放入字符串中,如其他答案和评论中所示。问题发生在您尝试将此数据输出到控制台时。Python认为您的控制台只能处理ascii。其他答案中有些说,“先写入文件”,但请注意,它们指定了编码(UTF-8)来进行写入(因此,Python在写入时不会更改任何内容),然后使用一种方法来读取文件,该方法仅输出字节而不考虑编码,这就是为什么它有效的原因。

谢谢!在使用asciitree包将结果写入文件时,我遇到了Unicode问题。这个解决方案对我很有帮助。 - Pål Thingbø
非常感谢。花了好几个小时在谷歌上搜索,很高兴我找到了这个。 - CharlyDelta
请添加以下内容: LANG=en_US.UTF-8 LC_ALL=en_US.UTF-8 LC_LANG=en_US.UTF-8 - Roger_S

21

在 Python 2 中,你需要使用 u 来声明 Unicode 字符串,例如 u"猫",同时使用 decode()encode() 分别进行 Unicode 编码和解码。

在 Python 3 中,这个过程要简单得多。你可以参考这里了解更多相关信息。这个演示对我帮助很大,希望对你也有所帮助。


1
谢谢提供视频链接,非常有用。 - arun
1
这篇文章也有非视频版本可供阅读: 实用的 Unicode,或者说,如何止痛?(Pycon2012) https://nedbatchelder.com/text/unipain.html - Tom Hundt

11

'+'替换为'000'。例如,'U+1F600'将变为'U0001F600',并在Unicode代码前面添加"\"并打印。

>>> print("Learning : ", "\U0001F40D")
Learning :  
>>> 

看看这个,也许会有帮助 Python Unicode表情


9

考虑到这个主题在谷歌搜索时的第一个堆栈溢出结果,值得一提的是,在Python 3中在Unicode字符串前加前缀u是可选的。(Python 2示例是从顶部答案复制的)

Python 3(两者都有效):

print('\u0420\u043e\u0441\u0441\u0438\u044f')
print(u'\u0420\u043e\u0441\u0441\u0438\u044f')

Python 2:

print u'\u0420\u043e\u0441\u0441\u0438\u044f'

谢谢!正是我所寻找的:一种通用的方法,在Python2和Python3中打印字符串中的Unicode字符。 - JenyaKh
限制版本也应该在Python 2中工作 - 夹具是一种选项,因此允许使用。 - Alexander Stohr

7

Python支持使用\N来表示命名的Unicode字符,这在提高代码可读性方面很有用。以下是一个示例:

assert '\N{snake}' == ''

这里列出了不同Python版本中的名称及其支持情况:https://dev59.com/cF0a5IYBdhLWcg3wdIfo - root

6

还有一件事情尚未添加

在Python 2中,如果要打印具有Unicode的变量并使用.format(),请执行以下操作(使正在格式化的基本字符串成为Unicode字符串:u''):

>>> text = "Université de Montréal"
>>> print(u"This is unicode: {}".format(text))
>>> This is unicode: Université de Montréal

4

我在Windows中使用便携式WinPython,其中包括IPython QT控制台,我可以实现以下功能。

>>>print ("結婚")
結婚

>>>print ("おはよう")
おはよう

>>>str = "結婚"


>>>print (str)
結婚

您的控制台解释器应该支持Unicode以显示Unicode字符。


3

这解决了Python中的UTF-8打印问题:

UTF8Writer = codecs.getwriter('utf8')
sys.stdout = UTF8Writer(sys.stdout)

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