python-3.x - 将 Unicode Escape 转换为希伯来语文本

标签 python-3.x unicode utf-8 hebrew unicode-escapes

我在 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)

我得到的文字是:
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')

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

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

任何帮助非常感谢...

最佳答案

此字符串不“代表”希伯来语文本(至少不是 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 文件,除非 JSON 本身只包含 ASCII,否则只会让一切变得更糟。

关于python-3.x - 将 Unicode Escape 转换为希伯来语文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52457095/

相关文章:

c# - String.Split() 和 String.IndexOf() 之间组合变音符号的不同行为

ruby - 如果文件名在 Windows 上具有 unicode 字符,Ruby 1.9.1 能否最终获得文件名列表?

java - 奇怪的 xml/html 重音问题

Python Dict 截断一个键

python - 您可以使用 ctypes 通过内存 id 将对象传递给 celery 任务吗?

.net - Encoding.UTF8.GetString 不考虑 Preamble/BOM

python - 转义 Django 模板中的特殊字符

node.js - 在 NodeJS 中将字符串从 utf8 转换为 latin1

python - 将字符串连接到列表

Python 3.5 无效签名 |辣椒机器人