2017-07-29 7 views
0

私は、DjangoのWebフック(Pythonで書かれています)を介してバイトエンコードされたテキストを取り込むプログラムを持っています。非標準文字をPythonでUTF8にデコードする

encoded = request.body 
decoded = parse_qs(encoded) 
body = decoded[b'body'][0].decode("utf-8") 

そして、これは誤りです:UTF-8は、通常の文字のために働い>が、それはアポストロフィが( ')で送信されたときに壊れ、私はこのテキストを復号化するために書かれている - 私はバイトからデコードをしています。

UnicodeEncodeError: 'ascii' codec can't encode character '\u2019' in position 5: ordinal not in range(128) 

アポストロフィを正常にデコードしたいのですが。私はまた、絵文字が送られてきたらそれが壊れるかもしれないと心配しているので、覚えている絵文字と∫のようなランダムな文字をエスケープすることができます。

+1

"バイト - > utf-8からのデコード"とはどういう意味ですか? UTF-8はUnicodeテキストを一連のバイトとしてエンコードする方法であるため、Unicode文字列をUTF-8バイトにエンコードすることも、UTF-8バイトをUnicode文字列にデコードすることもできます。 –

答えて

2

parse_qsは、デコードされたutf文字列で動作しますが、非ASCIIバイトでは動作します。たとえば:

これは失敗します。

a = b'restaurant_type=caf\xc3\xa9' 
urllib.parse.parse_qs(a) 
# > UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3...etc 

が、これは大丈夫作品を:

a = b'restaurant_type=caf\xc3\xa9' 
urllib.parse.parse_qs(a.decode()) 
# > {'restaurant_type': ['café']} 

は、あなたが何を求めているということですか?

+0

はい、ありがとうございます - 間違った順序で解析してデコードすると思います。 – hackerman

関連する問題