分析のために、URL エンコードされたバイナリ文字列 (おそらく印刷できない文字) をエスケープ解除する必要があります。残念なことに、文字列は拡張 URL エンコード形式 (例: "%u616f") になっています。生のバイナリ値を含むファイルにそれらを保存したい。0x61 0x6f ここ。
これをPythonでバイナリデータにするにはどうすればよいですか? (urllib.unquote は "%HH" 形式のみを処理します)
悲しいことに、文字列は拡張 URL エンコード形式で提供されます (例: "%u616f")。
ちなみに、これは URL エンコーディングとは関係ありません。これは、JavaScript の escape() 関数によって生成される、任意に作成された形式であり、それ以外にはほとんど何もありません。可能であれば、encodeURIComponent 関数を使用するように JavaScript を変更することをお勧めします。これにより、適切な標準の URL エンコードされた UTF-8 文字列が得られます。
例: "%u616f"。生のバイナリ値を含むファイルにそれらを保存したい。0x61 0x6f ここ。
0x61 0x6f (文字 "ao") が格納するバイト ストリームでよろしいですか? これは、UTF-16BE エンコーディングを意味します。すべての文字列をそのように扱っていますか?
通常は、入力を Unicode に変換してから、UTF-8 や UTF-16LE などの適切なエンコーディングを使用して書き出す必要があります。Python に '%u1234' を文字列エスケープ形式 u'\u1234' として読み込ませるハックに頼って、これを行う簡単な方法を次に示します。
>>> ex= 'hello %e9 %u616f'
>>> ex.replace('%u', r'\u').replace('%', r'\x').decode('unicode-escape')
u'hello \xe9 \u616f'
>>> print _
hello é 慯
>>> _.encode('utf-8')
'hello \xc2\xa0 \xe6\x85\xaf'
正規表現ベースのアプローチは次のとおりです。
# the replace function concatenates the two matches after
# converting them from hex to ascii
repfunc = lambda m: chr(int(m.group(1), 16))+chr(int(m.group(2), 16))
# the last parameter is the text you want to convert
result = re.sub('%u(..)(..)', repfunc, '%u616f')
print result
与える
ao