К сожалению, эта дыра проходит через две кроличьи норы, кодировки текста и 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
, но я не уверен.