我有一个带有unicode-escapes的ASCII编码的JSON文件(例如\\u201cquotes\\u201d
)和在字符串中转义的换行符(例如`"foo\\r\\nbar"
)。在Python中是否有一种简单的方法可以通过取消转义unicode-escape来生成utf-8编码文件,但保留换行符完好无损?
在字符串上调用decode('unicode-escape')
将解码unicode转义符(这是我想要的)但它也会解码回车符和换行符(我不想要)。
答案 0 :(得分:2)
当然有,使用正确的工具完成工作,并要求json
module将数据解码为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文字一样。
如果您绝对 只处理JSON输入中的\uabcd
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"'