python IDLE中unicode框绘制字符的输出不一致

时间:2015-08-11 15:16:30

标签: python unicode character

我有以下代码:

# -*- coding: utf-8 -*-
print "╔╤╤╦╤╤╦╤╤╗"
print "╠╪╪╬╪╪╬╪╪╣"
print "╟┼┼╫┼┼╫┼┼╢"
print "╚╧╧╩╧╧╩╧╧╝"
print "║"
print "│"

由于某种原因,只有第三行(╚╧╧╩╧╧╩╧╧╝)实际输出正确,其余的是符号的奇怪组合。我认为这是由于一些编码问题。 IDLE的完整输出如下:

╔╤╤╦╤╤╦╤╤╗
╠╪╪╬╪╪╬╪╪╣
╟┼┼╫┼┼╫┼┼╢
╚╧╧╩╧╧╩╧╧╝
â•‘
│

造成这种情况的原因是什么?如何解决这个问题?我使用平板电脑(带有Win10的Surface Pro 3)只有一个触摸键盘,因此任何打字量最少的解决方案(特别是键入奇怪的字符)都是理想的,但显然所有的帮助都很受欢迎。

2 个答案:

答案 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代码页,例如cp1252locale.getpreferredencoding(False))来解码Windows上的输出字节。不要将文本打印为字节。它将在使用与源代码不同的字符编码的任何环境中失败,例如,如果您运行使用cp437 OEM代码页的Windows控制台中的问题的代码,则会获得ΓòöΓòù... mojibake。

您应该对程序中的所有文本使用Unicode。 Python 3甚至禁止bytes字面内的非ascii字符。你会得到SyntaxError

如果您在Windows控制台中运行代码并且OEM代码页(例如cp437)无法表示字符,则

print(u'\u2554\u2557')可能会失败UnicodeEncodeErrorTo 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"│"

确切的原因仍然不为人所知,因为它似乎适用于其他系统,并且奇怪的是第三行工作正常。