为什么在Python的IDLE中有些字符打不出来?
Why some characters can not be typed in Python's IDLE?
我不知道怎么解释,其实我正在寻找解释,所以我只提一些重现问题的步骤。希望有人能够理解和阐述:
- Python 3.5.0 在 Windows 8.1 上。 (然而,无论 Python 和 Windows 版本如何,这都应该是可重现的。)
- 已安装波斯语标准键盘。 (可以从 here 下载。我再次确定问题不限于此特定键盘,其他一些语言的某些字符也有同样的问题。只是为了重现性。)
- 打开 IDLE,将键盘布局设置为波斯语并键入一些字符。
- 对于某些字符,如“â”(Shift+h)。它们打字非常好。
- 对于其他一些字符,例如 '' (d)。它们被转换为相似的字符,在本例中为“ي”(注意字形下方的小点)。
- 有些字符无法输入。例如 '﷼' (Shift+4)。这些被键入为“?”在闲置中。
- 以上所有字符几乎都可以在我安装的任何其他程序中输入。最简单的之一是 notepad.exe.
- 我们可以在另一个程序中输入相同的字符,例如notepad.exe 然后将它们复制并粘贴到 IDLE 中。这说明IDLE支持unicode字符,就是打不出来
我是 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.
我的问题仍然存在。
经过一番搜索,我找到了 this ticket on Tk's bug tracker。这几乎可以解释幕后发生的事情。 TCL/TK 在内部使用代码页将键盘输入转换为 UTF-8。
不幸的是,自 2014 年 9 月 18 日以来,没有 activity 解决此错误,这是一件令人遗憾的事情。该错误对许多语言产生了巨大影响,包括具有 Windows 代码页 (listed here) 的语言,甚至对许多其他没有任何代码页关联的语言(如孟加拉语)影响更大。
IMO,这应该是 TCL/TK 开发团队的最高优先级之一。在目前的状态下,对于需要在 Windows.
上支持 Unicode 输入的应用程序,用户不应依赖 Tcl/Tk
我不知道怎么解释,其实我正在寻找解释,所以我只提一些重现问题的步骤。希望有人能够理解和阐述:
- Python 3.5.0 在 Windows 8.1 上。 (然而,无论 Python 和 Windows 版本如何,这都应该是可重现的。)
- 已安装波斯语标准键盘。 (可以从 here 下载。我再次确定问题不限于此特定键盘,其他一些语言的某些字符也有同样的问题。只是为了重现性。)
- 打开 IDLE,将键盘布局设置为波斯语并键入一些字符。
- 对于某些字符,如“â”(Shift+h)。它们打字非常好。
- 对于其他一些字符,例如 '' (d)。它们被转换为相似的字符,在本例中为“ي”(注意字形下方的小点)。
- 有些字符无法输入。例如 '﷼' (Shift+4)。这些被键入为“?”在闲置中。
- 以上所有字符几乎都可以在我安装的任何其他程序中输入。最简单的之一是 notepad.exe.
- 我们可以在另一个程序中输入相同的字符,例如notepad.exe 然后将它们复制并粘贴到 IDLE 中。这说明IDLE支持unicode字符,就是打不出来
我是 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.
我的问题仍然存在。
经过一番搜索,我找到了 this ticket on Tk's bug tracker。这几乎可以解释幕后发生的事情。 TCL/TK 在内部使用代码页将键盘输入转换为 UTF-8。
不幸的是,自 2014 年 9 月 18 日以来,没有 activity 解决此错误,这是一件令人遗憾的事情。该错误对许多语言产生了巨大影响,包括具有 Windows 代码页 (listed here) 的语言,甚至对许多其他没有任何代码页关联的语言(如孟加拉语)影响更大。
IMO,这应该是 TCL/TK 开发团队的最高优先级之一。在目前的状态下,对于需要在 Windows.
上支持 Unicode 输入的应用程序,用户不应依赖 Tcl/Tk