12

ドキュメントによると、Python 2.7.3 では、shlex は UNICODE をサポートする必要があります。ただし、以下のコードを実行すると、次のようになります。UnicodeEncodeError: 'ascii' codec can't encode characters in position 184-189: ordinal not in range(128)

私は何か間違ったことをしていますか?

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)

これは、macports の python を使用した私の mac からの出力です。「ネイティブ」python 2.7.3 を使用している Ubuntu マシンでもまったく同じエラーが発生します。

4

3 に答える 3

12

このコードは、とインスタンスのshlex.split()両方をオブジェクトにラップします。これは、Latin-1 バイトのみを処理できます (したがって、完全な Unicode コードポイント範囲ではありません)。unicode()str()StringIO()

それでも使用したい場合は、エンコードする必要があります(UTF-8で動作するはずです)shlex.split(); モジュールのメンテナーは、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']

現在クローズされている Python の問題でこれに対処しようとしましたが、モジュールは非常にバイトストリーム指向であり、新しいパッチは具体化されていません。今のところ、私があなたのために思いつくことができる最善の方法は、使用iso-8859-1またはエンコードです。UTF-8

于 2013-01-08T16:07:20.940 に答える
3

実際には、5 年以上にわたってパッチが適用されています。昨年、私はすべてのプロジェクトで ushlex をコピーして PyPI に置くことにうんざりしていました。

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

于 2014-05-13T09:02:27.037 に答える