如何在Python中使用print显示特殊字符

15
在我编写的 Python 程序中,我需要打印 ©(版权)符号。有简单的方法吗?或者 Python 不支持它?

2
顺便提一下:你真的想要那些反斜杠吗?如果是这样,最好明确地将它们加倍,或者使用原始字符串,而不是依赖于\(\)恰好不是转义序列的事实。 - abarnert
嗯...对我来说,只使用一个反斜杠来打印引号和括号一直都有效。不过还是谢谢你的建议。 - Evan
5个回答

17
在Python中,您可以以三种方式将Unicode字符放入字符串中。(如果您使用的是2.x而不是3.x,则更简单的方法是使用Unicode字符串,例如u"..."而不是"...",并且您必须使用unichr而不是chr,但除此之外,一切都相同。)
  • '©': 直接输入即可。
    • 这意味着您可能需要为源代码选择字符编码,例如将文件明确保存为UTF-8,并在顶部放置一个编码标头。(对于3.3,UTF-8是默认值,因此如果您使用它,则不需要编码标头。)
    • 在Mac OS X下,在大多数语言的默认键盘设置中,这是opt-G。
    • 在Windows下,我认为您可以使用alt-numeric-keypad技巧和0169来输入它,尽管这似乎不太容易。
    • 如果您不知道如何使用键盘键入'©',请从其他地方复制并粘贴它(google“版权符号”,您应该会找到一个可以从中复制它的页面,或者从这里右键单击复制)。
    • 或者,您的计算机可能有类似Character Viewer的东西,可以让您指向并单击特殊字符。
  • '\u00a9': 使用Unicode数字转义序列。
    • 谷歌搜索“unicode版权符号”,您很快就会看到它是U+00A9。在Python中,那是`'\u00a9'。
    • 对于超出基本多语言平面(即超过4个十六进制数字)的任何内容,请使用大写U和8个数字。
  • '\N{COPYRIGHT SIGN}':使用Unicode实体名称转义序列。
    • 同样,您可能需要谷歌以找到实体的正确名称。
    • 并没有完全记录哪些名称可以使用。但是当您期望它起作用时,它通常会起作用,并且COPYRIGHT SIGN显然比00a9更可读。
你还可以采用间接方式——例如,unicodedata.lookup('COPYRIGHT SIGN')chr(0xa9)将返回与上面的字面值相同的字符串。但实际上没有理由不使用字面值。
Python文档中的Unicode HOWTO有更多详细信息。如果您不想阅读整个文档,则The String Type描述了不同种类的转义序列(以及在2.x中编码/解码unicode和字节字符串之间的问题,这些问题尤其重要),Unicode Literals in Python Source Code描述了如何指定编码声明。
如果您想获取官方字符列表而不仅仅是在谷歌上搜索,可以查看您所使用的Python版本的unicodedata文档,其中包含到适当版本的Unicode字符数据库的链接。(例如,在3.3.0中为6.1.0,在2.7.3中为5.2.0等)。您将需要通过一些链接来获取实际列表,但这是确保得到与Python编译成的内容完全相同的唯一方法。(如果您不关心这一点,那么您可以直接在谷歌上搜索,或者使用维基百科或计算机的字符查看器。)

@LastTigerEyes:不要在现有回答的评论中发布新问题。如果您有一个新问题,请创建一个新问题。您可以使用“分享”来获取URL,然后将其粘贴到新问题中以链接回此问题或答案。但请先搜索此问题;如果不是数百次,那么在本网站上已经有关于将Unicode输出打印到Windows“cmd.exe”终端的问题被问及和回答了。 - abarnert

11
在Python 2中:
>>> print u"\u00a9"
©
>>> print u"\N{COPYRIGHT SIGN}"
©

在Python 3中:
>>> print("\u00a9")
©
>>> print("\N{COPYRIGHT SIGN}")
©
>>> print("©")
©

在Python 2中,您必须在字符串前加上u(u"...")来告诉Python它是一个Unicode字符串。然而,在Python 3中,所有字符串都是Unicode字符串,所以您不需要(实际上在3.0-3.2中不允许)在字符串前加上u。
您可以在此处查看字符及其名称/Unicode值的列表:http://www.fileformat.info/info/charset/UTF-16/list.htm,并像在此处看到版权符号使用的方式一样使用它们。

实际上,在Python 3.2及更高版本中,您是可以在字符串前加上u的。当然,它并没有什么影响,但对于编写既适用于2.6-2.7又适用于3.2+的代码非常方便。 - abarnert
它在3.3中被重新加入,但是是的,我应该注意到这一点,谢谢。 - Ryan Haining

4
当然!输入版权符号:©
print("©")

(Python中没有类似于HTML中的字符实体。)

2
我要指出的是,根据您所在的地区,版权符号可能不是键盘上常见的符号... - Sinkingpoint
@Quirliom:它在哪里?我是用Compose、O、C打的,但除此之外,字符映射可能是一个好方法。 - Ry-
3
在Python 3中,chr(169)(或者更好的选择是chr(0xa9))不是UTF-8,而是Unicode字符#169。假设你正在使用3.x版本,考虑到你之前的评论和你使用 print作为函数,我认为你指的是Python 3.x版本。 - abarnert
  1. 实际上,UTF(如utf-8)是Unicode字符集的一种实现。
  2. 169是0xa9的十进制表示,为什么十六进制更好呢?!
  3. 正如你所看到的,我在提到python3.x,因为我写的是python3.2,它是python3.x版本(x=2)的一个版本。
- El Hocko
1
@cIph3r:1. 但是chr(169)不会返回一个UTF-8字符串。它返回一个Unicode字符串,其底层编码可以是明确的UTF-16或-32(3.0-3.2),或者是未指定的实现细节(3.3),而不是UTF-8。2. 十六进制可能更好,因为任何给出©字符编号的参考资料、帮助页面等都会以十六进制形式给出,例如U+00A9。因此,您(和您的读者)将不必来回转换。3. 您没有阅读括号中的注释吗?我明确表示假设您使用的是3.x,因为您在上一条评论中说了3.2。 - abarnert
显示剩余2条评论

4

版权标志是一种Unicode字符。如果您的终端支持包含此字符的字符编码(例如utf-8或cp1252),则可以打印它:

这取决于Python检测终端字符编码:

In [64]: print(u'\N{COPYRIGHT SIGN}')
©

这里使用了显式编码(因为我的终端设置为使用utf-8字符编码,所以能够正常工作):

In [65]: print(u'\N{COPYRIGHT SIGN}'.encode('utf-8'))
©

3
print u"\u00A9"

其中"\u00A9"是版权符号的Unicode字符。


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