03 Feb 2009 16:25

формат RTF

Делаю в TEA чтение формата RTF. Этот формат
был придуман программистами Майкрософт в середины восьмидесятых, в ходе
работы над Вордом. Согласно красивой легенде, синтаксис RTF был
вдохновлен языком разметки TeX. В самом деле, и там, и там есть буквы.
   С
точки зрения программиста, RTF гнусен. Чтобы научиться читать RTF
правильно, мало знать его спецификацию. Надо провести еще некоторые
исследования способом обратной инжерении.
   Текст хранится в RTF
разными способами. Если это английские буквы, они помещены в файле, как
есть (в семибитной кодировке). Если это буквы других алфавитов, то они
могут быть как в восьмибитной кодировке, так и в юникоде. Способ, как
узнать, используется юникод или нет, в формате не определен. Рассуждая
логически, я пришел к выводу, что - если в RTF-файле не указана кодовая
страница восьмибитной кодировки, значит, текст всё же в юникоде.
   А
это два разных способа разбора текста. Ведь не просто так лежат в RTF
эти буквы. Если они восьмибитные, то они имеют формат:
\'шестнадцатиричное значение. Пример:
\'c4\'e0\'ed\'ed\'ee\'e5
   Чтобы программно прочесть эту последовательность, надо:
1. Разобрать строку на элементы, избавившись от разделителей \'.
2.
Каждый элемент превратить из текста в целое число. При этом важно
учитывать, что в текстовом элементе число содержится в 16-ричном виде.
3. Перевести элемент из кодировки, указанной в заголовке RTF-файла, в юникод (потому что Qt работает с юникодом).
   А если в RTF уже лежит текст в юникоде? Не всё так просто! Он лежит там в закодированном виде:
\u1072\'3f\u1103\'3f \u1084\'3f\u1086\'3f\u1078\'3f\u1077\'3f\u<wbr>1090\'3f
   Тут задача следующая:
1. Разобрать на элементы.
2. Очистить каждый от ограничителей и удаляя недокументированный '3f.
3. Теперь в каждом элементе у нас есть десятиричный код символа, который перевести в юникод уже просто: QChar (code);
   Но! Мы временно забыли о командах разметки RTF. Пример текста, смешанного с такими командами:
-------
par \pard\plain \ltrpar\s3\cf0{\*\hyphen2\hyphlead2\hyph<wbr>trail2\hyphmax0}\aspalpha\sa120\ql\rtlch\a<wbr>f4\afs24\lang255\ltrch\dbch\af3\langfe25<wbr>5\hich\f0\fs24\lang1049\loch\f0\fs24\lan<wbr>g1049 {\rtlch \ltrch\loch }{\rtlch \ltrch\loch\f0\fs24\lang1049\i0\b0 \u1041\'3f\u1088\'3f\u1072\'3f\u1091\'3f\u<wbr>1079\'3f\u1077\'3f\u1088\'3f Elinks (http://elinks.or.cz)
---------
   Нам
нужно его очистить от команд. Есть много способов это сделать. Я начал
писать свой алгоритм, потом нашел в сети другой, переделал его (что
дало прирост в скорости обработки примерно в 5-6 раз). Но! Очистка эта
хавает семибитный текст и юникод, а вот декодированный (в тот же
юникод) из восьмибитной кодировки текст обрабатывать не хочет. Над
исправлением чего я сейчас и работаю.
   А сейчас сказка про волшебный горшок.
   Так
было в жизни. Мальчику Диме купили новый ночной горшок. Дима туда
покакал, посмотрел и удивился - горшок был пуст! И Дима позвал папу
Сережу.
   Тот пришел и предложил - а давай я туда ногу засуну. Так
и сделал. А потом покраснел, стал кричать - ой, нога! нога! А мальчик
Дима стоит и хохочет. Думает, папка шутит. Но вот упал папа Сережа и
нет у него пятки и всего, что дальше. Только кровь хлыщет - фыш!
Позови, говорит, мамку.
   Прибежала мама Катя, помазала там где нет
пятки зеленкой, а в это время из горшка высунулась рука и оторвала маме
Кате нос. А наверху жил дядя доктор, он услышал крики, спустился,
пришил маме Кате нос, а потом посмотрел на горшок и сказал - это же
научное открытие! нужно отнести его в Академию наук!
   Взял и
отнес. Стали там академики изучать горшок в центрифуге, а потом
выставили его в музее. И все, кто приходил на нее смотрел, исчезали.

Comments

Меф
Меф 03 Feb 2009 20:44
Ах, какая сказоченька! Если читать ее детям, то они быстрее будут приучаться к унитазу. Полезная находка!
roxton
roxton 03 Feb 2009 20:58
Иногда я и вменяемые сказки пишу - например вот -
Меф
Меф 03 Feb 2009 21:07
Ну и сказочка! Я только представила щуку на восьми колесах, мне плохо стало. Хорошо, что ее Вася съел.
Back to Top