Эта строка не «представляет» текст на иврите (по крайней мере, не в виде кодовых точек Юникода, 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будет уже интерпретировать escape-последовательности для вас.То есть после того, как текстовый элемент загружен десериализатором JSON, достаточно просто закодировать его как latin-1
, а затем декодировать как utf-8
.Это работает, потому что latin-1
(ISO-8859-1) является 8-битной кодировкой символов, которая точно соответствует первым 256 кодовым точкам Unicode, тогда как ваш странно разорванный текст кодирует каждый байт кодировки UTF-8 как ASCII-escape.кодового блока UTF-16.
Я не уверен, что вы можете сделать, если ваш JSON одновременно содержит и неработающие escape-последовательности, и допустимый текст, возможно, что latin-1
не делает 'больше не работает должным образом.Пожалуйста, не применяйте это преобразование к вашему файлу JSON, если только сам JSON не содержит только ASCII, это только ухудшит ситуацию.