如何让IDLE接受Unicode字符的粘贴?

时间:2014-08-05 04:14:26

标签: python windows python-2.7 unicode python-idle

通常,当我在IDLE中以交互方式工作时,我想将一个Unicode字符串粘贴到IDLE窗口中。它似乎正确粘贴但立即生成错误。输出时显示相同的字符没有问题。

>>> c = u'ĉ'
Unsupported characters in input

>>> print u'\u0109'
ĉ

我怀疑输入窗口和大多数Windows程序一样,在内部使用UTF-16,并且在处理完整的Unicode集时没有任何问题。问题是IDLE坚持强制将所有输入强制转换为默认的mbcs代码页,并且该页面中没有的任何内容都会被拒绝。

有没有办法配置或哄骗IDLE接受完整的Unicode字符集作为输入?

Python 3.2可以更好地处理这个问题,并且可以毫不费力地使用它。

我知道我可以简单地将代码保存到UTF-8文件中并导入它,但我希望能够在交互式窗口中使用Unicode字符。

1 个答案:

答案 0 :(得分:2)

我终于找到了办法。由于IDLE的源代码是分发的一部分,因此您可以进行一些快速编辑以启用该功能。这些文件通常位于C:\Python27\Lib\idlelib

第一步是防止IDLE尝试将所有那些漂亮的Unicode字符编码为无法处理它们的字符集。这由IOBinding.py控制。编辑文件,找到if sys.platform == 'win32':之后的部分并注释掉这一行:

#encoding = locale.getdefaultlocale()[1]

现在在它之后添加以下行:

encoding = 'utf-8'

我希望有一种方法可以用环境变量或其他东西来覆盖它,但getdefaultlocale直接调用Win32函数来获取全局配置的Windows mbcs编码。

这是成功的一半,现在我们需要让命令行解释器识别出输入字节是UTF-8编码的。它似乎没有办法将编码传递给解释器,所以我想出了所有黑客的母亲。也许有耐心的人可以想出一个更好的方法,但现在这个有用。输入在PyShell.py函数的runsource中处理。更改以下内容:

    if isinstance(source, types.UnicodeType):
        from idlelib import IOBinding
        try:
            source = source.encode(IOBinding.encoding)
        except UnicodeError:
            self.tkconsole.resetoutput()
            self.write("Unsupported characters in input\n")
            return

要:

    from idlelib import IOBinding  # line moved
    if isinstance(source, types.UnicodeType):
        try:
            source = source.encode(IOBinding.encoding)
        except UnicodeError:
            self.tkconsole.resetoutput()
            self.write("Unsupported characters in input\n")
            return
    source = "#coding=%s\n%s" % (IOBinding.encoding, source)  # line added

我们正在利用PEP 263为解释器提供的每行输入指定编码。

更新:在Python 2.7.10 中,不再需要在PyShell.py中进行更改,如果编码设置为utf-8。很遗憾,我还没有办法绕过IOBinding.py中的变化。