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

Lim*_*ess 4 unicode utf-8 hebrew unicode-escapes python-3.x

我的 json 文件中有以下文本:

\n\n
"\\u00d7\\u0090\\u00d7\\u0097\\u00d7\\u0095\\u00d7\\u0096\\u00d7\\u00aa \n\\u00d7\\u00a4\\u00d7\\u0095\\u00d7\\u009c\\u00d7\\u0092"\n
Run Code Online (Sandbox Code Playgroud)\n\n

它表示希伯来语中的文本“\xd7\x90\xd7\x97\xd7\x95\xd7\x96\xd7\xaa \xd7\xa4\xd7\x95\xd7\x9c\xd7\x92”。

\n\n

无论我使用哪种编码/解码,我似乎都无法正确使用 Python 3。

\n\n

例如,如果我尝试:

\n\n
text = "\\u00d7\\u0090\\u00d7\\u0097\\u00d7\\u0095\\u00d7\\u0096\\u00d7\\u00aa \n\\u00d7\\u00a4\\u00d7\\u0095\\u00d7\\u009c\\u00d7\\u0092".encode(\'unicode-escape\')\n\nprint(text)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我得到的文字是:

\n\n
b\'\\\\xd7\\\\x90\\\\xd7\\\\x97\\\\xd7\\\\x95\\\\xd7\\\\x96\\\\xd7\\\\xaa \\\\xd7\\\\xa4\\\\xd7\\\\x95\\\\xd7\\\\x9c\\\\xd7\\\\x92\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果我能够仅删除一个反斜杠并转过来,这在字节码中几乎是正确的文本

\n\n
b\'\\\\xd7\\\\x90\\\\xd7\\\\x97\\\\xd7\\\\x95\\\\xd7\\\\x96\\\\xd7\\\\xaa \\\\xd7\\\\xa4\\\\xd7\\\\x95\\\\xd7\\\\x9c\\\\xd7\\\\x92\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

进入

\n\n
text = b\'\\xd7\\x90\\xd7\\x97\\xd7\\x95\\xd7\\x96\\xd7\\xaa \\xd7\\xa4\\xd7\\x95\\xd7\\x9c\\xd7\\x92\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

(注意我如何将双斜杠更改为单斜杠)然后

\n\n
text.decode(\'utf-8\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

将产生正确的希伯来语文本。

\n\n

但我正在努力这样做,并且无法设法创建一段代码来为我做到这一点(而不是像我刚刚展示的那样手动......)

\n\n

非常感谢任何帮助...

\n

And*_*kin 5

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

\n\n

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

\n\n

假设这就是 JSON 文件中保存的内容:

\n\n
"\\u00d7\\u0090\\u00d7\\u0097\\u00d7\\u0095\\u00d7\\u0096\\u00d7\\u00aa \\u00d7\\u00a4\\u00d7\\u0095\\u00d7\\u009c\\u00d7\\u0092"\n
Run Code Online (Sandbox Code Playgroud)\n\n

您可以按如下方式恢复希伯来语文本:

\n\n
(jsonInput\n  .encode(\'latin-1\')\n  .decode(\'raw_unicode_escape\')\n  .encode(\'latin-1\')\n  .decode(\'utf-8\')\n)\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于上面的例子,它给出:

\n\n
\'\xd7\x90\xd7\x97\xd7\x95\xd7\x96\xd7\xaa \xd7\xa4\xd7\x95\xd7\x9c\xd7\x92\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

如果您使用 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 的 ASCII 转义-16个代码单元。

\n\n

我不确定如果您的 JSON 同时包含损坏的转义序列和有效文本,您可以做什么,可能无法latin-1再正常工作。请不要将此转换应用于您的 JSON 文件,除非 JSON 本身仅包含 ASCII,这只会让一切变得更糟。

\n