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

3

在使用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字符。

当我将上述内容剪切并粘贴到2.7控制台解释器中时,u'ĉ'会被转换为u'c'。我相信这是由Windows而不是Python完成的。在Idle中,粘贴由tcl/tk处理,由tkinter配置。这种混乱是Python 3存在的原因之一。使用Unicode最简单的方法是使用最新的3.x版本,因为我们不断改进它。 - Terry Jan Reedy
1个回答

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中更改的方法。

看起来很脆弱。如果你复制粘贴 (U+1F610 NEUTRAL FACE),会发生什么? - jfs
@J.F.Sebastian 我得到了 '\U0001f610'。你这边不行吗? - Mark Ransom
@J.F.Sebastian 在这里我使用的是Python 2.7.1,我很快会尝试在更新的版本上尝试。奇怪的是,当Windows支持完整的UTF-16编码时,它们会编码为UCS-2。 - Mark Ransom
@J.F.Sebastian 不,它也适用于2.7.5。我希望你不会让我个人对IDLE中的每个错误负责 - 显然,我在这里提出的黑客并没有引起问题。 - Mark Ransom
可能会受到tk版本的影响。_tkinter.TCL_VERSION == '8.6' 我使用Python 3.4。 - jfs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接