Конвертировать Unicode Escape в текст на иврите - PullRequest
0 голосов
/ 22 сентября 2018

У меня есть следующий текст в файле 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')

приведет к правильному тексту на иврите.

, но я изо всех сил пытаюсь это сделать и не могу создать кусок кодакоторый сделает это для меня (а не вручную, как я только что показал ...)

любая помощь очень ценится ...

1 Ответ

0 голосов
/ 22 сентября 2018

Эта строка не «представляет» текст на иврите (по крайней мере, не в виде кодовых точек Юникода, 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, это только ухудшит ситуацию.

...