我以前以为我已经把这些编码都搞清楚了。我好像错了,因为我无法解释这里发生了什么。在
我要做的是使用^{
from tabulate import tabulate
s = tabulate([[1,2],[3,4]], ["x","y"], tablefmt="fancy_grid")
print(s)
在ipython3.5.0的交互式控制台中。我期望结果是
^{pr2}$但是,我得到了
UnicodeEncodeError: 'charmap' codec can't encode character '\u2552' in position 0: character maps to <undefined>
困惑不解的是,我试图找出问题所在,并查看了字符串的repr
:
In [15]: s
Out[15]: '╒═════╤═════╕\n│ x │ y │\n╞═════╪═════╡\n│ 1 │ 2 │\n├─────┼─────┤\n│ 3 │ 4 │\n╘═════╧═════╛'
嗯,终端可以显示所有的字符(即使是第一个触发错误的字符)。在
只是检查一些细节:
In [16]: sys.stdout.encoding
Out[16]: 'cp850'
In [17]: s.encode("cp850")
[...]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2552' in position 0: character maps to <undefined>
那么终端使用哪种编码方式呢?Python说它是cp850
,它告诉我cp850
没有╒
字符(which is true,它是{
更复杂的是,当使用本机Python控制台而不是IPython时,错误似乎更容易理解:
>>> s
'\u2552═══\u2564═══\u2555\n│ 1 │ 2 │\n├───┼───┤\n│ 3 │ 4 │\n\u2558═══\u2567═══\u255b'
>>> sys.stdout.encoding
'cp850'
>>> print(s)
Traceback (most recent call last):
[...]
UnicodeEncodeError: 'charmap' codec can't encode character '\u2552' in position 0: character maps to <undefined>
所以至少Python是一致的,但是IPython发生了什么?在
IPython与其他Python控制台程序一样,在交互模式下使用OEM代码页:
如果安装了
^{pr2}$pyreadline
(它在IPython控制台中启用颜色等),结果会发生变化:一旦安装了
pyreadline
,IPython的sys.displayhook
将结果写入readline的console对象,该对象使用WriteConsoleW()
Windows Unicode API,允许打印当前代码页中甚至不可编码的Unicode字符(要查看它们,您可能需要在Windows控制台中配置一种(TrueType)字体,例如Lucida console)。在相关问题 更多 >
编程相关推荐