Как правильно декодировать шестнадцатеричные значения в RTF - PullRequest
0 голосов
/ 14 февраля 2019

К сожалению, эта дыра проходит через две кроличьи норы, кодировки текста и RTF.Но вот оно.

Фон

Я работаю над текстовым конвейером НЛП, где нам нужно преобразовать RTF в обычный текст, другими словами, нам нужно удалить управляющие символы RTF и оставитьсодержание текста не повреждено.Мы строим конвейер в Python, и у него есть несколько требований, которые мешают нам использовать что-то вроде Apache Tikka в производстве.

Я знаю, что RTF может содержать шестнадцатеричные значения, такие как \'a9, если автор документа набрал не-ascii символ.Я также знаю, что первая последовательность управляющих символов в документе определяет, как декодировать эти шестнадцатеричные значения, например, \ansicpg1252.Например, в этом случае наличие \ansicpg1252 в начале документа означает, что \'a9 следует интерпретировать как кодовую точку Unicode 00A9 (COPYRIGHT SIGN) согласно кодировке windows-1252 .

Вопрос

Я натолкнулся на документ RTF с \ansicpg1252 в первом наборе управляющих символов, однако в документе есть несколько мест, где появляются следующие шестнадцатеричные литералы, \'81\'aa.Это сбивает с толку, потому что 0x81 не определено в кодировке windows-1252.Я подумал, что это может быть utf-8, но в utf-8 оно тоже не определено.

WordPad.exe представляет эти два байта с этим символом: 10

Apache Tikka использует тот же символ,,

Этот символ соответствует кодовой точке Unicode 2191 (Upwards Arrow), икак выясняется, наши загадочные байты, 0x81AA, являются результатом кодирования этого символа с использованием кодировки Windows Code 932 , которая содержит японские символы.

Для справки, полный контекстиз этих двух байтов в документе RTF -

\plain\f1\fs20 \'81\'aa\plain\f0\fs20

, и документ содержит эту запись в группе \fonttbl:

{\f1\fmodern\fcharset128\fprq1 MS Mincho;}

, что, насколько я понимаю, означает, чтолюбой текст, следующий за \f1, должен отображаться с использованием шрифта MS Mincho, что имеет смысл, поскольку MS Mincho содержит японские глифы.Но как парсер RTF узнает, что 0x81AA должен быть декодирован с использованием Windows Code Page 932, а не ansicpg1252, как указано в первой строке файла?Нужно ли знать, что определенные шрифты подразумевают определенные кодировки?

По-моему, это связано с частью записи \fonttbl, которая говорит \fcharset128, но я не уверен.

1 Ответ

0 голосов
/ 15 февраля 2019

После публикации комментария я немного покопался ...

Аргумент fcharset исходит из фиксированного набора значений, которые соответствуют используемой кодировке.Вот пример:

https://github.com/joniles/rtfparserkit/blob/master/src/main/java/com/rtfparserkit/parser/standard/FontCharset.java

Из памяти я думаю Я взял их из спецификации Microsoft RTF (https://www.microsoft.com/en-us/download/details.aspx?id=10725)

...