我在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')
将在希伯来语中产生正确的文本。
但是我很努力地做到这一点,并且无法创建一段代码来为我做到这一点(而不是像我刚刚展示的那样手动完成...)
任何帮助,不胜感激...
答案 0 :(得分:2)
此字符串不“代表”希伯来语文本(至少不作为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解串器加载了text元素之后,仅将其编码为latin-1
,然后将其解码为utf-8
就足够了。之所以有效,是因为latin-1
(ISO-8859-1)是8位字符编码,与unicode的前256个代码点完全相对应,而奇怪的是,断行的文本将UTF-8编码的每个字节编码为ASCII -UTF-16代码单元的转义。
我不确定如果您的JSON同时包含损坏的转义序列和有效文本,那么您该怎么办,可能是latin-1
不能再正常工作了。除非JSON本身仅包含ASCII,否则请不要将此转换应用于您的JSON文件。