OS X 10.6.8 - 无法在Python交互模式中输入非ASCII/UTF-8字符(如:å, ä, ö)
我在使用 OS X 10.6.8 Snow Leopard
时,发现无法在交互模式下输入斯堪的纳维亚字母。每次按键都会响起终端的提示音,但屏幕上什么都不显示。在普通的终端环境中,所有字母都能正常显示。在终端中输入UTF8字符时,一切正常,包括运行Python脚本、在PyDev中和在REPL中。
这是不是交互模式的设置有问题,导致这些特殊字符无法输入呢?
我主要使用的是Python 2.7.3
,但系统自带的Python也有这个问题。(比如运行 python2.5
或 python2.6
时,我也会遇到同样的问题。)我不太确定安装Python 2.7是否改变了它使用的一些底层库,可能是 readline
(我在这里有点猜测的成分)。
3 个回答
我遇到的问题和这个链接里讨论的几乎一样:"如何定义/声明土耳其特殊字符的utf-8编码(非ascii),以便将它们用作标准utf-8编码?"。根据我目前的理解,这个问题主要是因为unicode和utf-8的定义不够有效。unicode和utf-8的声明是基于字符的显示字体(包括带重音的字符和一些非标准字符)。在以前,这样的定义可能还算可以,但现在的编程需求远远超出了基于ascii的ansi标准,而目前很多语言的字符编码声明(这些语言的字母表是基于ascii扩展的)在处理编码、转换和测试时都存在问题。你可以在我问题下的备注中找到更多细节。utf-8的设计初衷是没有版本限制,但我担心非英语的拉丁字母需要在utf-8的新版本中重新声明,以便为每个字母提供完整的范围,同时保持相同字符的字体一致。根据我的理论,每种字母表都会有自己的“A”,但它们的字符编码和代码点会有所不同,但所有的“A”都会指向相同的字体编码。因此,在任何语言中显示“A”时,都是使用字体编码,而每个“A”的编码值都会小于它所在字母表中的其他字符,但ascii的“z”永远不会小于“ŞşÇçÖö”或任何带重音的字符……
因为你在用的是2.7.3版本,而10.6系统自带的并不是这个版本,所以你显然是安装了一个第三方的Python。
如果你去看一下Python 2.7.3的下载页面,针对“Mac OS X 64位/32位 x86-64/i386安装程序(2.7.3)适用于Mac OS X 10.6和10.7”,上面提到:
你可能需要更新的Tcl/Tk安装才能运行IDLE或使用Tkinter,具体说明请查看注释2。
在注释2中:
这里有关于IDLE、Tkinter和Tcl/Tk在Mac OS X上的重要信息。此外,在Mac OS X 10.6上,如果你需要用32位的Python来构建C扩展模块,你需要使用Apple Xcode 3,而不是4。64位/32位的Python可以使用Xcode 3或Xcode 4。
如果你跟着这个链接,它会解释10.6自带的Tcl/Tk版本存在的问题。注意下面的图表中,Apple 8.5.7是特别不推荐的。
如果你想在10.6上用非Apple的Python来使用IDLE,图表建议安装ActiveTcl 8.5.13。
页面没有详细说明具体问题是什么,但如果我没记错的话,Apple的Tk在某些情况下,当TkInter接收到非ASCII字符时会崩溃,而他们为IDLE找到的最佳解决办法就是直接拒绝这些字符,这正是你所看到的情况。
如果你使用的是其他版本的Python 2.7.3(比如Enthought、ActiveState、Homebrew、MacPorts、自行编译等),它们大多没有详细的文档来说明这个问题,但同样的解决办法可能也能奏效。
我记得10.6也是Apple开始提供比较现代的Python版本和可用的IDLE的时间,所以你可能可以直接使用那个,而不是第三方的Python。(不过,我可能记错了,这可能只适用于10.7及以后的版本。)
这里的问题听起来是,python.org 的 Python 期待使用真正的 readline
,而不喜欢苹果提供的 libedit
替代品。
你可以查看 readline
在 PyPI 上的文档,了解这个问题的详细解释。
你可以按照以下步骤来解决这个问题:
sudo /path/to/easy_install readline
需要注意的是,readline
是少数几个不能通过 pip
正确安装的东西之一,所以你需要使用 easy_install
(或者手动安装)。
python.org 的 2.x 安装包里没有 easy_install
。你可以按照 setuptools
页面上的说明来安装它。
另外,要记住,在某些情况下,你可能会在 /usr/local/bin
和 /usr/bin
里都找到苹果的 python 的 easy_install
,这意味着你不能确定 /usr/local/bin/easy_install
会使用 python.org 的版本,所以最好明确使用 easy_install-X.Y
。
即使这样也不一定能解决问题,如果你使用的是苹果已经提供的 python.org(或其他)版本的 X.Y。比如 /usr/local/bin/easy_install-2.7
可能就是苹果的版本(就像我现在用的 10.8.2 机器上那样)。确保安全的唯一方法是检查 shebang 行,看看它使用的是哪个 Python 解释器。
或者,更简单的方法是,如果苹果已经给你安装了 python-X.Y,就不要再安装一个了。说真的,Stack Overflow 上有成百上千的问题都是因为人们这样做而导致的麻烦,而这些问题完全可以通过使用苹果的版本来避免。苹果以前提供的 Python 版本常常是坏的、不完整的,或者过时的,但自从 10.5 或 10.6 以来,他们提供的版本都能正常工作,功能完整,而且相对较新,还包括像 easy_install
和 PyObjC
这样的附加工具。