我有一个 ASCII 编码的 JSON 文件,其中包含 unicode 转义(例如,\\u201cquotes\\u201d
)和换行符在字符串中转义(例如,`"foo\\r\\nbar"
)。在 Python 中是否有一种简单的方法可以通过取消转义 unicode-escapes 来生成 utf-8 编码文件,但保持换行符不变?
调用decode('unicode-escape')
字符串将解码 unicode 转义(这是我想要的),但它也会解码回车符和换行符(我不想要)。
当然有,使用正确的工具并要求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 解码器的解码\r
就像\n
python 文字一样。
如果您绝对必须只处理\uabcd
JSON 输入中的 unicode 文字,而其余部分保持不变,那么您需要使用正则表达式:
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"'