2013-02-07 6 views
8

ユニコードデータ(utf-8エンコーディング)を含むバイト列(strunicodeではなく、Python 2.7)の束があります。Python 2.7 string.join()with unicode

私は("".join(utf8_strings)またはu"".join(utf8_strings)で)それらを結合しようとしています

UnicodeDecodeError: 'ascii' codec can't decode byte 0xec in position 0: ordinal not in range(128)` 

をスローした非ASCII文字列の.join()方法を利用するために方法はありますか?私はforループでそれらを連結することができますが、それは費用対効果の高いものではありません。

答えて

14

''.join()を使用して結合するバイト文字列はうまく動作します。建具としてUnicode値u''を使用して、文字列のリストにするUnicode文字列を追加するときに発生している上記

>>> utf8 = [u'\u0123'.encode('utf8'), u'\u0234'.encode('utf8')] 
>>> ''.join(utf8) 
'\xc4\xa3\xc8\xb4' 
>>> u''.join(utf8) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128) 
>>> ''.join(utf8 + [u'unicode object']) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128) 

例外:あなたが見るエラーがだけは、あなたがunicodestrオブジェクトを混入した場合に表示されます結合する。

+0

「unicode」オブジェクトと「str」オブジェクトをアンミックスする方法はありますか? – fiona

+1

@fionaはあなたのバイト文字列をUnicodeに決定してから参加します。可能な限り早くデコードするのが最善です。テキストの処理が完了したときにのみエンコードし、バイトを受け付けるようなものに渡す必要があります。 –

2

"".join(...)は、各パラメータがstr(エンコードがどのようなものであれ)であれば動作します。

あなたが見ている問題は、おそらく結合に関連するものではなく、あなたが提供するデータです。何が本当に間違っているかを確認できるように、コードを投稿してください。

+1

ご協力いただきありがとうございます。 'utf8_strings'は' xlrd'によって読み込まれたデータです。壮大なpythonモジュール 'xlrd'は、感謝してすべての(数値ではない)データを' unicode'で返します。私は彼らと一緒に作って、私はそれらのいくつかを 'str'と思った。 – thkang

関連する問題