15

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

u'ABRA\xc3O JOS\xc9'

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

誰か提案がありますか?

4

3 に答える 3

40

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、およびUnicode 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 ブラウザーなどである場合、事態はより複雑になり、より多くの情報がなければ簡単な答えはありません。

于 2013-10-22T20:13:58.810 に答える
0

で受け取ったを計算する必要がMD5 hashありました。MD5 が提供していて、Python の組み込みエンコーディング メソッドが機能しませんでした。これは、文字列内の文字が対応する文字に置き換えられ、. そこで、 からの変換中に文字列をそのまま保持する次のコードを思いつきました。unicode stringHTTP requestUnicodeEncodeErrorhex valuesMD5 hashunicode

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

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

于 2019-08-27T11:58:15.980 に答える