我有以下代码:
# -*- coding: utf-8 -*-
print "╔╤╤╦╤╤╦╤╤╗"
print "╠╪╪╬╪╪╬╪╪╣"
print "╟┼┼╫┼┼╫┼┼╢"
print "╚╧╧╩╧╧╩╧╧╝"
print "║"
print "│"
由于某种原因,只有第三行(╚╧╧╩╧╧╩╧╧╝)实际输出正确,其余的是符号的奇怪组合。我认为这是由于一些编码问题。 IDLE的完整输出如下:
╔╤╤╦╤╤╦╤╤╗
╠╪╪╬╪╪╬╪╪╣
╟┼┼╫┼┼╫┼┼╢
╚╧╧╩╧╧╩╧╧╝
â•‘
│
造成这种情况的原因是什么?如何解决这个问题?我使用平板电脑(带有Win10的Surface Pro 3)只有一个触摸键盘,因此任何打字量最少的解决方案(特别是键入奇怪的字符)都是理想的,但显然所有的帮助都很受欢迎。
答案 0 :(得分:1)
Mojibake表示以一种编码编码的文本以另一种不兼容的编码显示:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
print(u"╔╤╤╦╤╤╦╤╤╗".encode('utf-8').decode('cp1252')) #XXX: DON'T DO IT
# -> ╔╤╤╦╤╤╦╤╤╗
有几个地方可以使用错误的编码。
# coding: utf-8
编码声明会说明如何解释源代码中的非ascii字符(例如,字符串文字中)。如果print u"╔╤╤╦╤╤╦╤╤╗"
适用于您的情况,则表示源代码本身已正确解码为Unicode。对于调试,您可以仅使用ascii字符来编写字符串:u'\u2554\u2557' == u'╔╗'
。
print "╔╤╤╦╤╤╦╤╤╗"
(DON'做它)打印字节(在这种情况下使用utf-8编码的文本)。 IDLE本身适用于Unicode(BMP)。必须先将字节解码为Unicode文本,然后才能在IDLE中显示。似乎IDLE使用ANSI代码页,例如cp1252
(locale.getpreferredencoding(False)
)来解码Windows上的输出字节。不要将文本打印为字节。它将在使用与源代码不同的字符编码的任何环境中失败,例如,如果您运行使用cp437 OEM代码页的Windows控制台中的问题的代码,则会获得ΓòöΓòù...
mojibake。
您应该对程序中的所有文本使用Unicode。 Python 3甚至禁止bytes
字面内的非ascii字符。你会得到SyntaxError
。
print(u'\u2554\u2557')
可能会失败UnicodeEncodeError
。 To print arbitrary Unicode characters in Windows console, use win-unicode-console
package。如果您使用IDLE,则不需要它。
答案 1 :(得分:0)
根据@ FredLarson的建议,在字符串修正问题之前放一个u:
print u"╔╤╤╦╤╤╦╤╤╗"
print u"╠╪╪╬╪╪╬╪╪╣"
print u"╟┼┼╫┼┼╫┼┼╢"
print u"╚╧╧╩╧╧╩╧╧╝"
print u"║"
print u"│"
确切的原因仍然不为人所知,因为它似乎适用于其他系统,并且奇怪的是第三行工作正常。