2011-07-15 73 views
6

Tôi đang cố gắng thu thập một số raw_input unicode trong IDE python mặc định, và theo như tôi biết, nó phải đơn giản như:Không thể nhập unicode trong python IDE (Mac OS X)

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

Tuy nhiên, khi tôi cố gắng nhập các ký tự unicode, máy tính sẽ phát ra một số lời phản đối và tôi kết thúc bằng một chuỗi rỗng. (Để làm điều này, tôi nhấp vào bộ chuyển đổi IME gần thời gian và chọn phương thức nhập phù hợp [trong trường hợp này là kiểu nhập tiếng Nhật). Bên ngoài của python IDE, đầu vào hoạt động tốt, tôi có thể nhập các ký tự và hệ thống nhận ra chúng như đã được đầu vào. Trong IDE, tôi sẽ gõ một số chữ hiragana, và cửa sổ chọn chữ kanji thả xuống xuất hiện như thường lệ, nhưng khi tôi chọn biểu diễn thích hợp và nhấn enter, những tiếng bíp đó đến và tôi không có gì cả. Tôi đoán có một thiết lập liên quan đến một nơi nào đó mà tôi đã bỏ lỡ.

phiên bản là:

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 

không phải trong đó làm việc. Ngoài ra còn có điều này:

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

nhưng từ những gì tôi đã đọc, mã hóa mặc định là một con thú bí ẩn. Thay đổi nó không thực sự sửa chữa bất cứ điều gì anyway. Tức là,

>>> 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! 

không hoạt động. Chỉ cần thêm tiếng bíp. Tôi cũng không thể cắt và dán văn bản tiếng Nhật từ các ứng dụng khác.

+0

Bởi "Python IDE", bạn có nghĩa là IDLE không? –

+0

Nếu bạn ngụ ý IDLE, nó hoạt động tốt với tôi bằng Python 2.6.5. –

+0

Tôi thực sự có nghĩa là REPL, nhưng bị tổn thương não. – fromClouds

Trả lời

0

Chỉnh sửa: Tôi đã thử Python từ dòng lệnh (Thiết bị đầu cuối), và nó không hoạt động và tôi nhận được các tiếng bíp mà bạn đang nói đến. Nó không có vẻ là một giới hạn thiết bị đầu cuối, vì tôi có thể dán các ký tự tại dấu nhắc $ trong bash tốt. Nó hoạt động trong Idle, như tôi hiển thị bên dưới.

Chỉnh sửa # 2: Điều thú vị là, này một liner làm việc:

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

Tôi muốn đặt này trong một chú thích, nhưng nó sẽ không định dạng một cách chính xác. Output từ 2.6.5 trên MacOSX:

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'\u65e5\u672c\u8a9e' 
>>> 
+0

Được rồi, thật tuyệt khi có xác nhận độc lập về những gì tôi đang trải qua. Tuy nhiên, khi tôi kích hoạt IDLE, tôi cũng không thể nhập các ký tự tiếng Nhật, mặc dù thay vì từ chối nó hoàn toàn, nó chỉ chuyển vào các ký tự ASCII. (Tôi không chắc liệu bạn có quen thuộc với đầu vào tiếng Nhật hay không, nhưng bạn gõ những thứ bằng tiếng Anh ngữ âm, và nó thay thế chúng bằng tiếng Nhật ngữ âm, và sau đó khi bạn đến cuối từ, nó sẽ cho bạn một trình đơn thả xuống từ mà bạn chọn phiên bản nhân vật (ký tự Trung Quốc) Không ai trong số này xảy ra trong IDLE (mặc dù công việc cắt và dán) – fromClouds

+0

@fromClouds - Tôi không quen với hình thức đầu vào đó (cảm ơn bài học nhỏ!) IDLE dường như để có một số tự do với IO tiêu chuẩn, và tôi đoán có cái gì đó không chuẩn về cách nó chấp nhận đầu vào bàn phím.Tôi nghi ngờ bạn sẽ tìm thấy một tùy chọn thiết lập cho điều này, và bạn có thể phải tìm một IDE khác nhau từ IDLE để làm việc với. –

+0

Cảm ơn Chris, tôi nghĩ tôi sẽ có thể sẽ kết nối giao diện web cho thời điểm này. Ngoài ra, tôi lấy lại những gì tôi đã nói trước đó, cắt và dán (cho bất kỳ thứ gì lý do) treo IDLE. – fromClouds

0

Hãy thử điều này:

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'\u65e5\u672c\u8a9e' 

này làm việc cho tôi cho ký tự ASCII khi sử dụng Putty với mã hóa thiết bị đầu cuối thiết lập để UTF-8. Tôi thấy hộp vì tôi không có phông chữ cho các ký tự CJK được cài đặt, nhưng tôi nghĩ rằng điều này nên làm điều đó cho bạn.

Lý do hoạt động này là theo mặc định trình thông dịch Python sử dụng codec 'ascii' cho stdin, stdout và stderr. Và bởi vì ASCII chỉ xác định giá trị byte 0 đến 127, chỉ những giá trị byte mới có thể được in.

3

Tôi đã gặp sự cố tương tự. Trong trường hợp của tôi, nó trở thành một vấn đề libedit.Tôi đã sửa nó bằng cách cài đặt readline - mà tôi phải làm từ nguồn (từ đây: http://pypi.python.org/pypi/readline) vì sử dụng pip hoặc easy_install, vì lý do gì đó, không thực sự thay thế dòng đọc.

Nếu bạn đã cài đặt ipython, nó sẽ cho bạn biết khi khởi động nếu bạn đang sử dụng libedit. Và, nếu bạn có cùng trải nghiệm tôi đã làm, bạn sẽ thấy cùng một vấn đề trong cả trình thông dịch python trong Terminal và trong ipython. Một khi tôi đã đọc readline thực sự cài đặt, và ipython không còn thông báo cho tôi rằng nó đã được sử dụng libedit, các vấn đề với nhập Unicode biến mất trong cả hai python và ipython.

(Lưu ý:. Tôi cũng có bpython cài đặt - và, vì nó dường như không sử dụng readline hoặc libedit, nhưng thay vì thói quen line-biên tập của riêng mình, vào Unicode trong bpython luôn làm việc)

3

Mã hóa mặc định sẽ không ảnh hưởng đến ở đây. Tôi đã có một vấn đề tương tự và đối với tôi giải pháp là để kiểm tra các tùy chọn Thoát phi ASCII trong Thiết bị đầu cuối> Tùy chọn> Cài đặt> Nâng cao. Đồng thời đảm bảo rằng mã hóa Ký tự được đặt thành Unicode (UTF-8) trong cùng một trang cài đặt.