web-dev-qa-db-ja.com

Python-UnicodeからASCII変換

データを失うことなく、次のUnicodeをASCIIに変換できません:

u'ABRA\xc3O JOS\xc9'

私はencodedecodeを試しましたが、彼らはそれをしません。

誰か提案がありますか?

13
Adriano Almeida

Unicode文字_u'\xce0'_および_u'\xc9'_には、対応するASCII値はありません。したがって、データを失わないようにするには、そのデータをASCIIとして有効な方法があります。オプションは次のとおりです。

_>>> print s.encode('ascii', errors='backslashreplace')
ABRA\xc3O JOS\xc9
>>> print s.encode('ascii', errors='xmlcharrefreplace')
ABRAÃO JOSÉ
>>> print s.encode('unicode-escape')
ABRA\xc3O JOS\xc9
>>> print s.encode('punycode')
ABRAO JOS-jta5e
_

これらはすべてASCII文字列であり、元のUnicode文字列からのすべての情報が含まれています(したがって、データを失うことなくすべて逆にすることができます)。ただし、どれも、エンドユーザー(およびdecode('ascii')だけで元に戻すことはできません)。

詳細は _str.encode_Python Specific Encodings 、および nicode HOWTO を参照してください。


ちなみに、一部の人々が「ASCII」と言うとき、それらは実際には「ASCII」を意味するのではなく、「ASCIIのスーパーセットである8ビット文字セット」または「私が持っているいくつかの特定の8ビット文字セット」を意味しますマインド"。それがあなたの意図したことなら、解決策は正しい8ビット文字セットにエンコードすることです:

_>>> s.encode('utf-8')
'ABRA\xc3\x83O JOS\xc3\x89'
>>> s.encode('cp1252')
'ABRA\xc3O JOS\xc9'
>>> s.encode('iso-8859-15')
'ABRA\xc3O JOS\xc9'
_

難しいのは、意図した文字セットを知ることです。 8ビット文字列を生成するコードとそれを消費するコードの両方を記述していて、それ以上の知識がない場合は、UTF-8を意味しています。たとえば、8ビット文字列を使用するコードがopen関数や、ページの配信先であるWebブラウザーなどである場合、状況はより複雑になり、簡単に答えることはできません。より多くの情報。

39
abarnert

MD5 hashで受け取ったunicode stringHTTP requestを計算する必要がありました。 MD5はUnicodeEncodeErrorとpython=組み込みのエンコードメソッドを提供していましたが、文字列内の文字を対応するhex valuesに置き換えて、 MD5 hash。ですから、unicodeから変換するときに文字列をそのまま維持する次のコードを考え出しました。

unicode_string = ''.join([chr(ord(x)) for x in unicode_string]).strip()

これにより、文字列からunicodeの部分が削除され、すべてのデータがそのまま保持されます。

0
Rhythm Chopra