たとえば、Unicode文字列がある場合、次のようにASCII文字列としてエンコードできます。
>>> u'\u003cfoo/\u003e'.encode('ascii')
'<foo/>'
ただし、たとえば次のASCII文字列があります。
'\u003foo\u003e'
...上記の最初の例と同じASCII文字列に変換したい:
'<foo/>'
これを理解するのにしばらく時間がかかりましたが、このページに最良の答えがありました:
>>> s = '\u003cfoo/\u003e'
>>> s.decode( 'unicode-escape' )
u'<foo/>'
>>> s.decode( 'unicode-escape' ).encode( 'ascii' )
'<foo/>'
Unicode 文字列を指定する別の方法を処理する「raw-unicode-escape」コーデックもあります。詳細については、リンクされたページの「Unicode コンストラクター」セクションを確認してください (私は Unicode に精通していないため)。
編集: Python Standard Encodingsも参照してください。
ある時点で、デコードしたい文字列に漢字や顔文字などの特殊文字が含まれている場合、次のようなエラーが発生することがあります。
UnicodeEncodeError: 'ascii' codec can't encode characters in position 109-123: ordinal not in range(128)
私の場合 (twitter データ処理)、次のようにデコードして、すべての文字をエラーなしで表示できるようにしました。
>>> s = '\u003cfoo\u003e'
>>> s.decode( 'unicode-escape' ).encode( 'utf-8' )
>>> <foo>
Python 2.5 では、正しいエンコーディングは「unicode-escape」ではなく「unicode_escape」です (アンダースコアに注意してください)。
Python の新しいバージョンが Unicode 名を変更したかどうかはわかりませんが、ここではアンダースコアでのみ機能しました。
とにかく、これです。
ネッド・バッチェルダーは次のように述べています。
ひもがどこから来ているかによっては少し危険ですが、次のようにします。
>>> s = '\u003cfoo\u003e' >>> eval('u"'+s.replace('"', r'\"')+'"').encode('ascii') '<foo>'
実際、このメソッドは次のように安全にすることができます:
>>> s = '\u003cfoo\u003e'
>>> s_unescaped = eval('u"""'+s.replace('"', r'\"')+'-"""')[:-1]
三重引用符の文字列と、最後の三重引用符の直前のダッシュに注意してください。
したがって、生の形式でキャプチャされている限り、ユーザーが何を入力するかを心配する必要はありません。
ひもがどこから来ているかによっては少し危険ですが、次のようにします。
>>> s = '\u003cfoo\u003e'
>>> eval('u"'+s.replace('"', r'\"')+'"').encode('ascii')
'<foo>'