2013-01-08 32 views
10

Theo tài liệu, trong Python 2.7.3, shlex sẽ hỗ trợ UNICODE. Tuy nhiên, khi chạy mã bên dưới, tôi nhận được: UnicodeEncodeError: 'ascii' codec can't encode characters in position 184-189: ordinal not in range(128)shlex.split vẫn không hỗ trợ unicode?

Tôi có làm gì sai không?

import shlex 

command_full = u'software.py -fileA="sequence.fasta" -fileB="新建文本文档.fasta.txt" -output_dir="..." -FORMtitle="tst"' 

shlex.split(command_full) 

Các lỗi chính xác là như sau:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shlex.py", line 275, in split 
    lex = shlex(s, posix=posix) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/shlex.py", line 25, in __init__ 
    instream = StringIO(instream) 
UnicodeEncodeError: 'ascii' codec can't encode characters in position 44-49: ordinal not in range(128) 

Đây là sản lượng từ mac của tôi sử dụng python từ macports. Tôi nhận được chính xác cùng một lỗi trên máy Ubuntu với "bản địa" python 2.7.3.

+0

Nó không ủng hộ việc 'unicode() 'đối tượng; nó không thể xử lý bất cứ điều gì trừ các ký tự ASCII ngay cả khi sử dụng đối tượng 'unicode()' ngay bây giờ. –

+0

@MartijnPieters có phải là lỗi hoặc hành vi dự kiến ​​không? Tôi không thể tìm thấy bất kỳ tham chiếu nào đến hạn chế trong tài liệu – petr

+0

Lỗi đã biết, tôi muốn nói, xem [vấn đề này] (http://bugs.python.org/issue742290). –

Trả lời

11

shlex.split() kết thúc tốt đẹp cả unicode()str() trường hợp trong một đối tượng StringIO(), mà chỉ có thể xử lý Latin-1 byte (như vậy không phải là đầy đủ unicode phạm vi điểm mã).

Bạn sẽ phải mã hóa (thành UTF-8 sẽ hoạt động) nếu bạn vẫn muốn sử dụng shlex.split(); các nhà duy trì của mô-đun có nghĩa là các đối tượng unicode() được hỗ trợ ngay bây giờ, không phải bất kỳ thứ gì ngoài phạm vi của các điểm mã hóa Latin-1.

Encoding, chia tách, giải mã mang lại cho tôi:

>>> map(lambda s: s.decode('UTF8'), shlex.split(command_full.encode('utf8'))) 
[u'software.py', u'-fileA=sequence.fasta', u'-fileB=\u65b0\u5efa\u6587\u672c\u6587\u6863.fasta.txt', u'-output_dir=...', u'-FORMtitle=tst'] 

Một now closed Python issue đã cố gắng để giải quyết vấn đề này, nhưng các mô-đun là rất byte dòng định hướng, và không có bản vá mới đã thành hiện thực. Hiện tại, việc sử dụng mã hóa iso-8859-1 hoặc UTF-8 là cách tốt nhất tôi có thể cung cấp cho bạn.

2

Thực tế đã có bản vá trong hơn năm năm. Năm ngoái, tôi đã mệt mỏi của việc sao chép một ushlex xung quanh trong mỗi dự án và đặt nó trên PyPI:

https://pypi.python.org/pypi/ushlex/

Các vấn đề liên quan