将Unicode转义符转换为希伯来文本

4

我有一个json文件,其中包含以下文本:

"\u00d7\u0090\u00d7\u0097\u00d7\u0095\u00d7\u0096\u00d7\u00aa 
\u00d7\u00a4\u00d7\u0095\u00d7\u009c\u00d7\u0092"

这段文本代表希伯来语中的“אחוזת פולג”。

无论我使用哪种编码/解码方法,在 Python 3 中都似乎无法正确地处理它。

例如,如果我尝试:

text = "\u00d7\u0090\u00d7\u0097\u00d7\u0095\u00d7\u0096\u00d7\u00aa 
\u00d7\u00a4\u00d7\u0095\u00d7\u009c\u00d7\u0092".encode('unicode-escape')

print(text)

我明白“text is”是什么意思:

b'\\xd7\\x90\\xd7\\x97\\xd7\\x95\\xd7\\x96\\xd7\\xaa \\xd7\\xa4\\xd7\\x95\\xd7\\x9c\\xd7\\x92'

在字节码中,几乎是正确的文本,如果我能够去除仅有的一个反斜杠并转换。

b'\\xd7\\x90\\xd7\\x97\\xd7\\x95\\xd7\\x96\\xd7\\xaa \\xd7\\xa4\\xd7\\x95\\xd7\\x9c\\xd7\\x92'

转化为

text = b'\xd7\x90\xd7\x97\xd7\x95\xd7\x96\xd7\xaa \xd7\xa4\xd7\x95\xd7\x9c\xd7\x92'

注意我将双斜杠改为单斜杠,然后

text.decode('utf-8')

我希望能够得到正确的希伯来文本。

但我正在努力实现它,却无法创建一个可以为我完成此操作的代码片段(而不是手动处理,如我刚刚展示的...)

非常感谢任何帮助...


你能把它发回来吗?在JSON文档中请求“אחוזת פולג”或“\u05D0\u05D7\u05D5\u05D6\u05EA\u0020\u05E4\u05D5\u05DC\u05D2”。 - Tom Blodget
看看这个:Facebook JSON badly encoded - Andrey Tyukin
1个回答

5

这个字符串不是希伯来文本(至少不是作为Unicode码点、UTF-16、UTF-8或任何众所周知的方式)。相反,它代表了一系列UTF-16代码单元,这个序列主要由乘法符号、货币符号和一些奇怪的控制字符组成。

看起来原始字符数据已经使用某些奇怪的编码组合进行了几次编码和解码。

假设这确实是保存在您的JSON文件中的内容:

"\u00d7\u0090\u00d7\u0097\u00d7\u0095\u00d7\u0096\u00d7\u00aa \u00d7\u00a4\u00d7\u0095\u00d7\u009c\u00d7\u0092"

您可以按照以下步骤恢复希伯来文本:
(jsonInput
  .encode('latin-1')
  .decode('raw_unicode_escape')
  .encode('latin-1')
  .decode('utf-8')
)

对于上述示例,它会给出以下结果:
'אחוזת פולג'

如果您正在使用JSON反序列化器来读取数据,那么您当然应该省略.encode('latin-1').decode('raw_unicode_escape')步骤,因为JSON反序列化器已经为您解释了转义序列。也就是说,在文本元素被JSON反序列化器加载后,只需将其编码为latin-1,然后解码为utf-8即可。这样做的原因是latin-1(ISO-8859-1)是一种8位字符编码,与Unicode的前256个代码点完全对应,而您奇怪的破碎文本将UTF-8编码的每个字节都编码为UTF-16代码单元的ASCII转义符。
如果您的JSON同时包含损坏的转义序列和有效文本,我不确定您能做什么,可能latin-1不能正常工作。除非JSON本身只包含ASCII,否则请不要将此转换应用于您的JSON文件,否则会使情况更加糟糕。

感谢您的详细解释。我的 JSON 文件包含普通英文文本和 \u00xxx 类型的文本(表示希伯来语)。我没有办法事先区分英文和希伯来语部分的文本……您有什么处理方法吗? - Limitless
@Limitless 我认为,如果你的纯英文文本严格在ASCII 0-127范围内,它实际上仍然可以工作,因为它会通过所有编码解码阶段而不改变。你能想出一个它不起作用的例子吗? - Andrey Tyukin
这是有关编程的内容,从Facebook帖子/页面/评论中提取的数据,所以我猜没有太多特殊字符...如果我遇到这样的字符,我会进行更新...谢谢! - Limitless
@Limitless 我不认为有任何理由假设来自Facebook帖子的数据中没有每一种奇怪的字符。在(相当可能的)情况下,如果你发现了任何超出通常ASCII范围的字符,并且它们没有以与你原始问题中的文本相同的“奇怪”格式编码,我建议你调查为什么数据首先以这种破碎的格式到达,而不是试图从已经损坏的文本中重构原始含义。 - Andrey Tyukin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接