2017-02-06 3 views
1

私はこのように、文字のUnicodeエスケープコードを返すために、Pythonの文字列のencode方法を使用しようとしています:Pythonの '.encode(' unicode_escape ')を使ってasciiのエスケープコードを返すにはどうしたらいいですか?

>>> print('ф'.encode('unicode_escape').decode('utf8')) 
\u0444 

これは、非ASCII文字を正常に動作しますが、ASCII文字のために、それだけを返しますアスキー文字自体:

>>> print('f'.encode('unicode_escape').decode('utf8')) 
f 

希望する出力は\u0066です。このスクリプトは教育的な目的のためのものです。

すべての文字に対してUnicode 16進コードを取得するにはどうすればよいですか?

+0

' 'F'' は他に何を返すために、あなたが期待していますか? –

+0

できません。 'unicode_escape'は印刷可能なASCII文字をエスケープしません。ここで何をしようとしていますか?言い換えれば、*実際の目標*は何ですか? –

+0

@MartijnPieters上記の編集を参照してください。このスクリプトは教育目的のためのもので、 'f'の出力は' \ u0066'です。 – reynoldsnlp

答えて

2

あなたのリクエストは奇妙です。 Pythonでは、通常は代わりにordを使用します。ここではエンコード/デコードする必要はありません。

>>> '"\\U{:08x}"'.format(ord('f')) # ...or \u{:04x} if you prefer 
'"\\U00000066"' 
>>> eval(_) 
'f' 
+0

ありがとう! 16進形式の 'ord'と' x'仕様の組み合わせは完全に動作するようです。 – reynoldsnlp

1

これは手動で行う必要があります。すべての入力がUnicode BMPの範囲内にあると仮定すると、簡単な正規表現がおそらく最も速くなります。これは彼らの\uhhhhエスケープとのすべての文字を置き換える:

import re 

def unicode_escaped(s, _pattern=re.compile(r'[\x00-\uffff]')): 
    return _pattern.sub(lambda m: '\\u{:04x}'.format(
     ord(m.group(0))), s) 

私は優雅に非BMPポイントを処理するために、BMPにパターンを明示的に制限されてきました。

デモ:

>>> print(unicode_escaped('foo bar ф')) 
\u0066\u006f\u006f\u0020\u0062\u0061\u0072\u0020\u0444 
関連する問題