2013-01-08 13 views
10

Zgodnie z dokumentacją, w Pythonie 2.7.3, shlex powinien obsługiwać standard UNICODE. Jednak po uruchomieniu kodu poniżej otrzymam: UnicodeEncodeError: 'ascii' codec can't encode characters in position 184-189: ordinal not in range(128)shlex.split wciąż nie obsługuje Unicode?

Czy robię coś nie tak?

import shlex 

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

shlex.split(command_full) 

Dokładny błędu jest następujący:

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) 

Jest to wyjście z moim Mac przy użyciu Pythona z DarwinPorts. Dostaję dokładnie taki sam błąd na komputerze z Ubuntu z "natywnym" pythonem 2.7.3.

+0

To nie obsługuje 'Unicode()' obiektu; nie może obsłużyć nic poza znakami ASCII, nawet jeśli teraz używa się obiektu 'unicode()'. –

+0

@MartijnPieters to błąd lub oczekiwane zachowanie? Nie mogłem znaleźć żadnego odniesienia do ograniczenia w dokumentacji – petr

+0

Znany błąd, powiedziałbym, zobacz [ten problem] (http://bugs.python.org/issue742290). –

Odpowiedz

11

Kod shlex.split() otacza zarówno unicode() i str() wystąpienia w A StringIO() obiektu, które mogą obsługiwać tylko Łacińskiej 1 bajtów (więc nie w pełni unicode zakres kodowy).

Będziesz musiał kodować (do UTF-8 powinno działać), jeśli nadal chcesz używać shlex.split(); opiekunowie modułu oznaczali, że obiekty unicode() są teraz obsługiwane, po prostu nie jest to nic poza zakresem wartości Latin-1 w kodepunkach.

Kodowanie, podział, dekodowanie daje mi:

>>> 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'] 

now closed Python issue starał się zająć, ale moduł jest bardzo zorientowane na strumień bajtów, a nie nowa łatka została zrealizowana. Na razie kodowanie iso-8859-1 lub UTF-8 jest najlepsze, co mogę wymyślić dla ciebie.

2

W rzeczywistości istnieje łata od ponad pięciu lat. W ubiegłym roku dostałem zmęczony kopiowanie ushlex wokół w każdym projekcie i umieścić go na PyPI:

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