【问题标题】:Unescape unicode-escapes, but not carriage returns and line feeds, in Python在 Python 中取消转义 unicode 转义,但不包括回车和换行
【发布时间】:2026-01-07 10:15:02
【问题描述】:

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

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

【问题讨论】:

  • “解码换行符”是什么意思?它们存储为字节0x0A0x0D\r\n 只是这些字节值的特殊字符串表示形式。
  • @TimPietzcker:可能数据包含一些原始反斜杠 + n 字符。从理论上讲是这样。不太可能,但如果是这样,那么.decode('unicode-escape') 确实会尝试解释这些。
  • @TimPietzcker:啊,JSON format 允许 \n\r\t 等,就像 Python 一样。事实上,格式不允许使用\x0a\x0d 字节,您应该使用\n\r 组合对它们进行编码。
  • @MartijnPieters:但它是"\\r\\n",而不是"\r\n" 字符串。
  • @TimPietzcker:完全正确,但请注意,在 JSON 中,Unicode 转义因此在 Python 中也表示为 '\\u201c',并且 OP 也没有将这些斜杠加倍。

标签: python utf-8


【解决方案1】:

当然有,使用正确的工具并要求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 解码器在 \n 上解码 \r,就像 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"'

【讨论】: