1

\\u201cquotes\\u201dユニコードエスケープ(例)と文字列内でエスケープされた改行(例)を含むASCIIエンコードのJSONファイルがあります`"foo\\r\\nbar"。Pythonで、unicode-escapesのエスケープを解除して、改行エスケープをそのままにして、utf-8でエンコードされたファイルを生成する簡単な方法はありますか?

文字列を呼び出すdecode('unicode-escape')と、Unicodeエスケープ(私が望むもの)がデコードされますが、キャリッジリターンと改行(私が望まないもの)もデコードされます。

4

1 に答える 1

2

確かに、ジョブに適したツールを使用して、jsonモジュールにデータをPythonにデコードするように依頼してくださいunicode。次に、結果をUTF-8にエンコードします。

import json

json.loads(input).encode('utf8')

unicode-escape実際のPython文字列リテラルにのみ使用してください。JSON文字列は、一見非常に似ているように見えますが、Python文字列と同じではありません。

短いデモ(Pythonインタラクティブインタープリターが文字列をリテラルとしてエコーすることを考慮に入れてください):

>>> json.loads(r'"\u201cquotes\u201d"').encode('utf8')
'\xe2\x80\x9cquotes\xe2\x80\x9d'
>>> json.loads(r'"foo\r\nbar"').encode('utf8')
'foo\r\nbar'

JSONデコーダーはPythonリテラルと同じようにデコード\rすることに注意してください。\n

JSON入力のUnicodeリテラルのみを処理する必要があり、残りはそのままにしておく必要がある場合は、正規表現を使用する必要があります\uabcd

import re

codepoint = re.compile(r'(\\u[0-9a-fA-F]{4})')
def replace(match):
    return unichr(int(match.group(1)[2:], 16))

codepoint.sub(replace, text).encode('utf8')

これは次のようになります。

>>> codepoint.sub(replace, r'\u201cquotes\u201d').encode('utf8')
'\xe2\x80\x9cquotes\xe2\x80\x9d'
>>> codepoint.sub(replace, r'"foo\r\nbar"').encode('utf8')
'"foo\\r\\nbar"'
于 2013-01-16T20:42:14.477 に答える