1

我有一个 ASCII 编码的 JSON 文件,其中包含 unicode 转义(例如,\\u201cquotes\\u201d)和换行符在字符串中转义(例如,`"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 解码器的解码\r就像\npython 文字一样。

如果您绝对必须只处理\uabcdJSON 输入中的 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"'
于 2013-01-16T20:42:14.477 回答