在Python中,Unescape unicode-escapes,但不是回车符和换行符

时间:2013-01-16 20:37:33

标签: python utf-8

我有一个带有unicode-escapes的ASCII编码的JSON文件(例如\\u201cquotes\\u201d)和在字符串中转义的换行符(例如`"foo\\r\\nbar")。在Python中是否有一种简单的方法可以通过取消转义unicode-escape来生成utf-8编码文件,但保留换行符完好无损?

在字符串上调用decode('unicode-escape')将解码unicode转义符(这是我想要的)但它也会解码回车符和换行符(我不想要)。

1 个答案:

答案 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"'