为什么有些字符无法在Python的IDLE中输入?

时间:2015-12-06 10:07:14

标签: unicode tkinter tk python-idle codepages

我不知道如何解释这个,实际上我正在寻找解释,所以我只想提一些重现问题的步骤。希望有人能够理解和阐述:

  1. Windows 8.1上的Python 3.5.0。 (但无论Python和Windows版本如何,这都应该是可重现的。)
  2. 安装了波斯语标准键盘。 (它可以从here下载。再次,我确定问题不仅限于这个特定的键盘,并且在其他一些语言中有一些字符存在同样的问题。只是为了重复性。)< / LI>
  3. 打开IDLE,将键盘的布局设置为波斯语并输入一些字符。
  4. 对于某些字符,例如'Â'(Shift + h)。它们输入完全正常。
  5. 对于其他一些角色,如'ی'(d)。它们被转换为相似的字符,在本例中为'ي'(注意字形下的小点)。
  6. 有些字符无法输入。例如'﷼'(Shift + 4)。这些输入为'?'在IDLE。
  7. 以上所有字符都可以输入我安装的几乎任何其他程序。其中一个最简单的是notepad.exe。
  8. 我们可以在另一个程序中键入相同的字符,例如notepad.exe然后将它们复制并粘贴到IDLE中。这表明IDLE支持unicode字符,只是无法输入它们。
  9. 我是IDLE的粉丝。它是标准Python安装附带的轻量级IDE,我不想因此而切换到另一个IDE。但对于我来说,以上是最讨厌IDLE的事情。每当我需要编写一个包含波斯语字符的程序时,我不能相信IDLE正确输入它们,我必须打开其他程序并使用复制粘贴方法。

    我正在寻找的是:

    • 为什么会这样?问题在哪里?
    • 有没有变通办法?
    • 与此问题直接相关的任何文档或错误报告。

    此信息也可能有所帮助:

    >>> import locale
    >>> locale.getdefaultlocale()
    ('en_US', 'cp1256')
    >>> locale.getpreferredencoding()
    'cp1256'
    >>> locale.getlocale()
    ('English_United States', '1252')
    >>> 
    >>> import sys
    >>> sys.getdefaultencoding()
    'utf-8'
    

    感谢。

    更新

    请参阅下面的前三条评论。这个问题似乎是由于在输入tkinter应用程序时使用WindowsBestFit mappings引起的。

    为了测试它是在python / tkinter绑定或tcl / tk本身中的一些错误配置,我下载并安装了Tkabber。这是一个用Tcl / Tk编写的应用程序。那么,存在完全相同的问题,即我不能输入上述字符,但可以复制和粘贴它们。所以我的结论是问题的根源在于tcl / tk本身而不是IDLE / Python / tkinter。

    我的问题仍然存在。

1 个答案:

答案 0 :(得分:6)

经过一番搜索后,我在this ticket上找到了Tk's bug tracker。这几乎解释了幕后发生的事情。 TCL / TK在内部使用代码页将键盘输入转换为UTF-8。

不幸的是,自2014-09-18以来,这个bug一直没有活动,这是一件令人伤心的事情。这个bug对许多语言产生了巨大的影响,包括那些拥有Windows代码页(listed here)的语言,以及许多其他没有任何与之相关的代码页(如孟加拉语)的语言。

IMO,这应该是TCL / TK开发团队的最高优先事项之一。在当前状态下,用户不应该依赖Tcl / Tk来处理需要Windows上的Unicode输入支持的应用程序。