无法在 python IDE (Mac OS X) 中输入 unicode



我试图在默认的python IDE中收集一些unicode raw_input,据我所知,它应该像:

>>> c = raw_input()
日本語
>>> print c
日本語

然而,当我尝试输入unicode字符时,计算机发出一些警告,我最终得到一个空字符串。(为此,我单击时间附近的IME切换器并选择适当的输入法(在本例中是日文输入法)。在python IDE之外,输入工作得很好,我可以输入字符,系统将它们识别为已输入。在IDE中,我将输入一些平假名,下拉的汉字选择窗口像往常一样出现,但是当我选择适当的表示并按下enter键时,那些哔哔声就来了,我什么也没有得到。我想一定是我错过了某个场景。

版本:

Python 2.6.1 (r261:67515, Jun 24 2010, 21:47:49) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin

Python 2.5.4 (r254:67916, Jun 24 2010, 21:47:25) 
[GCC 4.2.1 (Apple Inc. build 5646)] on darwin

两者都不行。还有这个:

>>> import sys
>>> sys.getdefaultencoding()
'ascii'
>>> sys.stdin.encoding
'UTF-8'
>>> sys.stdout.encoding
'UTF-8'
>>> sys.getfilesystemencoding()
'utf-8'

但是从我读到的,默认编码是一个神秘的野兽。改变它实际上并不能解决任何问题。也就是

>>> import sys
>>> sys.setdefaultencoding('utf-8')
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'setdefaultencoding'
>>> reload(sys)
<module 'sys' (built-in)>
>>> sys.setdefaultencoding('utf-8')
>>> # !!!
... c = raw_input()
no dice!

是行不通的。只是更多的哔哔声。我也不能从其他应用程序中剪切和粘贴日语文本。

defaultencoding不应该影响这里。我有一个类似的问题,对我来说,解决方案是检查转义非ascii输入选项在终端>首选项>设置>高级。还要确保在相同的设置页面中将字符编码设置为Unicode (UTF-8)。

我也遇到过同样的问题。在我的例子中,它原来是一个libedit问题。我通过安装readline来修复它——我必须从源代码(从这里:http://pypi.python.org/pypi/readline)完成,因为使用pipeasy_install,无论出于何种原因,实际上并没有取代readline。

如果你已经安装了ipython,它会在启动时告诉你是否正在使用libedit。而且,如果你有和我一样的经验,你会在Terminal和python解释器中看到同样的问题。一旦我真正安装了readline,并且ipython不再通知我它正在使用libedit,在python和ipython中输入Unicode的问题就消失了。

(注意:我还安装了bpython——而且,由于它似乎不使用readline或libedit,而是使用自己的行编辑例程,因此在bpython 中输入Unicode总是有效。)

编辑:我从命令行(终端)尝试了Python,它工作,我得到你正在谈论的哔哔声。这似乎不是终端限制,因为我可以将$提示符中的字符粘贴到bash中。它确实在空闲状态下工作,如下所示。

编辑#2:有趣的是,这一行确实有效:

 $ python -c "exec("c=raw_input()nprint c")"
 日本語  <-- pasted
 日本語

我想把它放在注释中,但是格式不正确。MacOSX上2.6.5的输出:

Python 2.6.5 (r265:79359, Mar 24 2010, 01:32:55) 
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "copyright", "credits" or "license()" for more information.
    ****************************************************************
    Personal firewall software may warn about the connection IDLE
    makes to its subprocess using this computer's internal loopback
    interface.  This connection is not visible on any external
    interface and no data is sent to or received from the Internet.
    ****************************************************************
IDLE 2.6.5      
>>> c=raw_input()
日本語
>>> print c
日本語
>>> c
u'u65e5u672cu8a9e'
>>> 

试试这个:

import codecs, sys
sys.stdin = codecs.getreader('UTF-8')(sys.stdin)
sys.stdout = codecs.getwriter('UTF-8')(sys.stdout)
sys.stderr = codecs.getwriter('UTF-8')(sys.stderr)
print u'u65e5u672cu8a9e'

当使用终端编码设置为UTF-8的Putty时,这适用于我的非ascii字符。我看到方框是因为我没有安装CJK字符字体,但我认为这应该可以为您做。

这个工作的原因是默认情况下Python解释器使用'ascii'编解码器用于stdin, stdout和stderr。因为ASCII只定义字节值0到127,所以只能打印字节值

最新更新