3

我发现了很多与此相同的问题 - 但尽管我尽了最大努力,但我无法让任何解决方案发挥作用。

我正在尝试打印扩展 ascii 字符以制作旧的基于文本的菜单。这是我的原始代码:

print('╔════════════════════════════════════╗')
print('║           Hello World!             ║')
print('╚════════════════════════════════════╝')

当我运行 .py 文件时,我的输出如下所示:

??????????????????????????????????????
?           Hello World!             ?
??????????????????????????????????????

我正在使用 Python 3.3.1,需要一个可以在 Windows 和 Linux 中“正常工作”的解决方案。我试过chcp 65001在我的 Windows 控制台中使用,但没有任何运气。

我试过使用'setdefaultencoding',但我相信它不再适用于 Python 3。

4

3 回答 3

4

必须有更好的方法,但是这样的事情怎么样:

dic = {
'\\' : b'\xe2\x95\x9a',
'-'  : b'\xe2\x95\x90',
'/'  : b'\xe2\x95\x9d',
'|'  : b'\xe2\x95\x91',
'+'  : b'\xe2\x95\x94',
'%'  : b'\xe2\x95\x97',
}

def decode(x):
    return (''.join(dic.get(i, i.encode('utf-8')).decode('utf-8') for i in x))

print(decode('+------------------------------------%'))
print(decode('|           Hello World!             |'))
print(decode('\\------------------------------------/'))

视窗:

C:\Temp>python temp.py
╔════════════════════════════════════╗
║           Hello World!             ║
╚════════════════════════════════════╝

Linux:

$ python3 temp.py 
╔════════════════════════════════════╗
║           Hello World!             ║
╚════════════════════════════════════╝
于 2013-06-22T20:35:21.367 回答
3

使用 Python 3 及其 Unicode 字符串,只要您遵循以下规则,您的原始代码应该可以正常工作:

  • 以支持字符的编码保存您的文件。
  • #coding: <encoding>如果不是 UTF-8 默认值,则通过声明源编码。
  • 默认控制台编码支持字符。
  • 控制台字体支持字符字形。

请注意,coding我在下面添加的语句是可选的,因为utf8它是 Python 3 上的默认设置。只需确保您的文件实际上以正确的编码保存即可。

# coding: utf8
print('╔════════════════════════════════════╗')
print('║           Hello World!             ║')
print('╚════════════════════════════════════╝')

我的 Windows 控制台上的输出(代码页 437,Consolas 字体):

╔════════════════════════════════════╗
║           Hello World!             ║
╚════════════════════════════════════╝

我的 PythonWin IDE 上的输出(UTF-8 编码,以及通常的 Linux 默认值,加上 Courier New 字体):

╔════════════════════════════════════╗
║           Hello World!             ║
╚════════════════════════════════════╝

注意chcp 65001(UTF-8) 在 Windows 和/或 Python 3 上是错误的:

╔════════════════════════════════════╗
��═══════════════════════╗
�══════════════╗
�════════╗
�════╗
��═╗
��
║           Hello World!             ║
��
╚════════════════════════════════════╝
��═══════════════════════╝
�══════════════╝
�════════╝
�════╝
��═╝
��

还不需要注意setdefaultdecoding,即使在 Python 2 上也是如此。Unicode 字符串不是默认值。此代码适用于 Python 2.XPython 3.3 及更高版本,因为 Python 3.3 添加了可选u''语法以帮助移植 Python 2.X 代码:

# coding: utf8
print(u'╔════════════════════════════════════╗')
print(u'║           Hello World!             ║')
print(u'╚════════════════════════════════════╝')
于 2013-06-22T21:14:04.163 回答
1

这是我可以观察到的。请注意,在我的情况下,默认编码是 852(Windows 7,捷克语)。代码以 UTF-8 存储,使用 Python 3.3.0。

在此处输入图像描述

这似乎是错误,但我不知道是在 Python 中,在 Windows 控制台中,还是在我的椅子或键盘之间。

于 2013-06-22T21:15:27.843 回答