2013-01-08 147 views
10

根據文檔,在Python 2.7.3中,shlex應該支持UNICODE。但是,在運行下面的代碼時,我得到:UnicodeEncodeError: 'ascii' codec can't encode characters in position 184-189: ordinal not in range(128)shlex.split仍然不支持unicode?

我做錯了什麼?

import shlex 

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

shlex.split(command_full) 

確切的錯誤是以下幾點:

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) 

這是使用python的MacPorts從我的Mac輸出。在「native」python 2.7.3的Ubuntu機器上,我得到了完全相同的錯誤。

+0

它不支持Unicode的'()'對象;即使現在使用'unicode()'對象,它也不能處理除ASCII字符以外的任何內容。 –

+0

@MartijnPieters是一個錯誤或預期的行爲?我無法在文檔中找到任何有關限制的提述 – petr

+0

已知錯誤,我想說,請參閱[此問題](http://bugs.python.org/issue742290)。 –

回答

11

shlex.split()代碼包裝在一個StringIO()對象既unicode()str()實例,這隻能處理Latin-1的字節(所以不完整的Unicode碼點範圍)。

如果你仍然想使用shlex.split(),你必須編碼(UTF-8應該可以工作);該模塊的維護人員意味着現在支持unicode()對象,而不是任何超出Latin-1範圍的代碼點。

編碼,分割,解碼給我:

>>> 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試圖解決這一問題,但該模塊是面向非常字節流,並沒有新的補丁已經兌現。現在使用iso-8859-1UTF-8編碼是我能爲你想出的最好的。