データを失うことなく、次のUnicodeをASCIIに変換できません:
u'ABRA\xc3O JOS\xc9'
私はencode
とdecode
を試しましたが、彼らはそれをしません。
誰か提案がありますか?
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ブラウザーなどである場合、状況はより複雑になり、簡単に答えることはできません。より多くの情報。
MD5 hash
で受け取ったunicode string
のHTTP request
を計算する必要がありました。 MD5はUnicodeEncodeError
とpython=組み込みのエンコードメソッドを提供していましたが、文字列内の文字を対応するhex values
に置き換えて、 MD5 hash
。ですから、unicode
から変換するときに文字列をそのまま維持する次のコードを考え出しました。
unicode_string = ''.join([chr(ord(x)) for x in unicode_string]).strip()
これにより、文字列からunicode
の部分が削除され、すべてのデータがそのまま保持されます。