XML電子メールの添付ファイルを次のように読みました。
bytes_string=part.get_payload(decode=False)
私の変数名が示すように、ペイロードはバイト文字列として入ってきます。
私はこの文字列を私が操作できる使用可能な文字列に変換するためにPython 3の推奨アプローチを使用しようとしています。
例は次のとおりです。
str(b'abc','utf-8')
変数bytes_string
にb
(bytes)キーワード引数を適用して、推奨される方法を使用する方法
私が試した方法はうまくいきません。
str(bbytes_string, 'utf-8')
あなたはそれを最後の行でほぼ正しかった。欲しい
str(bytes_string, 'utf-8')
bytes_string
の型はbytes
であり、b'abc'
の型と同じです。
bytes
インスタンスに対してdecode()
を呼び出して、エンコードしたテキストを取得します。
str = bytes.decode()
更新:
最初と最後に
b
と引用符を付けないでください。
あなたのコードは'utf-8'
エンコーディングに対して認識できない文字を持っているかもしれないので、追加のパラメータなしでstrだけを使うほうが良いです:
bad_bytes = b'\x02-\xdfI#)'
text = str( bad_bytes )[2:-1]
'utf-8'
パラメータをこれらの特定のバイトに追加すると、エラーを受け取るはずです。
PYTHON 3 standardが言うように、text
は現在utf-8に入っていても問題ありません。
配列から非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+FFFD
、REPLACEMENT CHARACTER
の使用)、または'ignore'
(Unicodeの結果から文字を削除するだけ)です。