web-dev-qa-db-ja.com

Python 3のバイト文字列変数を通常の文字列に変換する方法を教えてください。

XML電子メールの添付ファイルを次のように読みました。

bytes_string=part.get_payload(decode=False)

私の変数名が示すように、ペイロードはバイト文字列として入ってきます。

私はこの文字列を私が操作できる使用可能な文字列に変換するためにPython 3の推奨アプローチを使用しようとしています。

例は次のとおりです。

str(b'abc','utf-8')

変数bytes_stringb(bytes)キーワード引数を適用して、推奨される方法を使用する方法

私が試した方法はうまくいきません。

str(bbytes_string, 'utf-8')
74
DjangoTango

あなたはそれを最後の行でほぼ正しかった。欲しい

str(bytes_string, 'utf-8')

bytes_stringの型はbytesであり、b'abc'の型と同じです。

146
Toby Speight

bytesインスタンスに対してdecode()を呼び出して、エンコードしたテキストを取得します。

str = bytes.decode()
39
uname01

更新:

最初と最後にbと引用符を付けないでください。

あなたのコードは'utf-8'エンコーディングに対して認識できない文字を持っているかもしれないので、追加のパラメータなしでstrだけを使うほうが良いです:

bad_bytes = b'\x02-\xdfI#)'
text = str( bad_bytes )[2:-1]

'utf-8'パラメータをこれらの特定のバイトに追加すると、エラーを受け取るはずです。

PYTHON 3 standardが言うように、textは現在utf-8に入っていても問題ありません。

4
Behzad Seyfi

配列から非UTF-8文字をフィルタリング(スキップ)するにはどうすればいいですか?

@ uname01の投稿およびOPでこのコメントを修正するには、エラーを無視してください。

コード

>>> b'\x80abc'.decode("utf-8", errors="ignore")
'abc'

詳細

docs から、同じerrorsパラメータを使用した例がさらに増えます。

>>> b'\x80abc'.decode("utf-8", "replace")
'\ufffdabc'
>>> b'\x80abc'.decode("utf-8", "backslashreplace")
'\\x80abc'
>>> b'\x80abc'.decode("utf-8", "strict")  
Traceback (most recent call last):
    ...
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x80 in position 0:
  invalid start byte

Errors引数は、入力文字列がエンコードの規則に従って変換できない場合の応答を指定します。この引数の有効な値は、'strict'UnicodeDecodeError例外を発生させる)、'replace'U+FFFDREPLACEMENT CHARACTERの使用)、または'ignore'(Unicodeの結果から文字を削除するだけ)です。

3
pylang