IPython终端使用哪种字符编码?

2024-09-29 22:34:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我以前以为我已经把这些编码都搞清楚了。我好像错了,因为我无法解释这里发生了什么。在

我要做的是使用^{}模块打印一个格式良好的表,使用

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发生了什么?在


Tags: toinposition字符cancodecencodemaps
1条回答
网友
1楼 · 发布于 2024-09-29 22:34:39

IPython与其他Python控制台程序一样,在交互模式下使用OEM代码页:

In [1]: '\u2552'
ERROR - failed to write data to stream: <_io.TextIOWrapper name='<stdout>' mode=
'w' encoding='cp850'>
Out[1]:

In [2]: !chcp
Active code page: 850

如果安装了pyreadline(它在IPython控制台中启用颜色等),结果会发生变化:

^{pr2}$

一旦安装了pyreadline,IPython的sys.displayhook将结果写入readline的console对象,该对象使用WriteConsoleW()Windows Unicode API,允许打印当前代码页中甚至不可编码的Unicode字符(要查看它们,您可能需要在Windows控制台中配置一种(TrueType)字体,例如Lucida console)。在

相关问题 更多 >

    热门问题