Чем открыть файл.RTF? Что означает формат файла RTF, чем его открыть

Приложение MS Office известно практически всем пользователям компьютеров уже если не во всем мире, то в нашей стране точно. Такая популярность во многом связана с растущими потребностями современного мира в создании и обмене информацией. В любом современном государственном учреждении ежедневно создаются и отправляются тысячи документов, а потому возникает настойчивая потребность в программах, которые бы могли стандартизировать и упростить данный процесс.

Впрочем, в этой связи куда более интересен rtf-формат, который в большинстве случаев может позиционироваться как универсальное средство передачи информации. Кстати, а чем он так хорош? Почему бы не использовать doc?

Дело в том, что rtf-формат открыто поддерживается практически всеми операционными системами, а также может быть прочитан простейшими Для его использования нет необходимости в установке сложных, тяжелых и дорогих офисных пакетов. Большая часть приложений для работы с текстовыми данными поддерживает сохранение в этом стандарте.

Но даже не за это rtf-формат так любят пользователи. В отличие от вышеупомянутого doc, а также docx, odt и прочих подобных файлов, в нем может содержаться только текст. Неопытные пользователи могут решить, что и во всех вышеперечисленных разновидностях текстовых документов нет ничего другого, но это не так. Дело в том, что в том же любимом нашими отечественными пользователями офисном формате doc могут находиться макросы. По сути, это самые настоящие программы, которые могут быть использованы злоумышленниками в далеко не благих целях.

Именно на них приходится немалая часть заражений, происходящих в момент запуска скачанных из интернета текстовых документов. Используя же rtf-формат, вы фактически ничем не рискуете. Но есть у него и определенные недостатки, которые также нужно принимать во внимание, выполняя сохранение своей работы. К примеру, чтобы преобразовать rtf-формат в txt, все равно придется воспользоваться каким-либо офисным приложением. Но это особой проблемы не представляет.

К примеру, невозможно использовать для создания динамически связанных документов. Внедрение объектов в документ-приемник приводит к значительному увеличению размера последнего. В связи с этим иногда используется способ, при котором устанавливается только связь с исходником. При этом объект хотя и отображается в документе-приемнике, но не сохраняется в нем, так как внутри документа имеется лишь ссылка на исходный файл или объект. А потому не вставляйте особенно большие картинки в rtf-формат.

Кроме того, есть у него и определенные проблемы с форматированием. Так, не вздумайте сохранить важный документ или диплом в формат rtf. Чем открыть его, вы найдете всегда, вот только гарантии сохранения исходного вида вашего творения никто не даст. Кроме того, практически полностью отсутствует Проще говоря, если вы сохранили работу в старой версии программы, то в новом приложении она практически наверняка не откроется.

Надеяться на OpenSource продукты не стоит, так как на данный момент Microsoft (а именно эта компания является создателем формата), выложила в открытый доступ только первичные версии rtf.

Данный формат был определен фирмой Microsoft как стандартный формат для обмена текстовыми документами. Следовательно, по назначению этот формат подобен SYLK-формату для электронных таблиц. RTF поддерживается многими продуктами фирмы Microsoft. Так, например, начиная с версии 2.0, он введен в Windows в качестве Clipboard-формата, благодаря чему возможен обмен данными между различными прикладными программами Windows. Кроме того, RT-формат поддерживается программами WORD для Macintosh, начиная с версии 3.X, и WORD для PC, начиная с версии 4. X.

В RTF для обмена документами используются только представимые символами коды из ASCII-, MAC- и PC-символьного набора. Кроме текста, файл в RT-формате в читаемой форме содержит команды управления.

Документ состоит преимущественно из команд управления настройки программы чтения файлов в RTF-формате. Эти команды можно разделить на управляющие слова (control words) и управляющие символы (control symbols).

Управляющее слово представляет собой последовательность символов с разделителем (delimiter) в конце:

\lettersequence

Перед управляющим словом вводится обратная косая черта "\" (backslash). В качестве разделяющих могут использоваться следующие символы:

  • Пробел (space), причем этот символ относится к управляющему слову;
  • Цифра или знак "-". После этих символов должен следовать параметр с разделителем. В качестве разделителя может быть использован пробел или другие символы, кроме цифр и букв;
  • Все символы, отличные от цифр и букв. Эти символы не относятся к управляющему слову .

В RT-формате для задания управляющей последовательности используются буквы от "А" до "Z" и от "а" до "z", а также цифры от "0" до "9". Национальные символы к управляющей информации не относятся.

В качестве, управляющих символов используются отдельные буквы. Перед каждым управляющим символом вводится обратная косая черта "\":

\control symbol

В настоящее время определены только некоторые из этих символов. Поэтому при чтении неизвестные символы могут быть пропущены.

В RT-формате существует возможность объединять отдельные последовательности в группы при помощи скобок:

{ начало группы } конец группы

Такие группы создаются, например, при описании сносок, колонтитулов и т.п. Если необходимо разместить символы "\", "{" или "}" внутри обычного текста, то перед ними надлежит поставить обратную косую черту:

\\ \{ \}.

Это позволяет программе, читающей RTF-последовательность, распознать, что символ не следует интерпретировать как управляющий.

В RT-формате используются также некоторые символьные коды для управления печатью

Символы CR и LF, расположенные внутри текста, будут пропущены. Microsoft использует эти символы для большей наглядности при представлении RTF-файла. Внутри управляющих слов символы CR и LF могут иметь особое значение, подробнее об этом будет сказано при описании команд.

Специальные управляющие слова (special control words)

В RTF имеются управляющие слова специального назначения. Рассмотрим кратко эти слова и их назначение.

Управляющее слово change page number выводит текущий номер страницы.

Управляющее слово change footnote активизирует автоматическую нумерацию сносок.

С помощью change date можно вывести текущую дату.

С помощью change time можно вывести текущее время.

\chftnsep

Свидетельствует об изменении линии, отделяющей сноски от текста.

С помощью данной последовательности вводится текст формулы.

Обозначает подпункт индекса.

Текст может быть пропущен при чтении RTF-формата.

Задает жесткий (неразрываемый) пробел между двумя словами, т.е. в этой позиции предложение не может быть разделено при переносе на следующую строку.

Символ обозначает мягкий перенос (nonrequired hyphen).

Символ обозначает неразрываемый перенос (nonbreaking hyphen), на месте которого слово не может быть разделено.

Последовательность позволяет прямой ввод в тексте шестнадцатеричных чисел. Они задаются вместо символов hh.

Данная последовательность задает переход на новую страницу.

Эта последовательность вызывает переход на новую строку в тексте.

С помощью данной последовательности в тексте отмечается конец абзаца. Последовательность \раr может заменяться последовательностью \10 или \13. При этом \10 соответствует ASCII-символу с кодом 10 (carriage return). Непосредственно ввести ASCII-код 10 (CR) нельзя, т.к. он игнорируется программой чтения.

Эта последовательность обозначает конец текстового фрагмента или текстового абзаца.

Данная последовательность заменяет табулятор. Можно также непосредственно задавать ASCII-код 09Н.

Конец таблицы (столбец).

Конец таблицы (строка).

Операторы настройки (destination control words)

С помощью описанных ниже управляющих слов можно произвести основную настройку программы чтения RTF. Они могут встречаться только в начале документа или в начале группы. Все операторы вместе с параметрами должны быть заключены в скобки, например:

{\rtf0\pc.......}

Ниже описан формат некоторых операторов.

\rtf <параметр>

Задает метку начала файла. В качестве параметра программа, при помощи которой создается файл, может указывать номер версии. Например:

{\rtf0.......}

Метка должна стоять в начале файла. После этого оператора могут следовать другие операторы или закрывающая скобка.

Установка вида кодировки для сохраняемого текста осуществляется с помощью следующих операторов:

  • \ansi: текст хранится в стандартном ASCII-формате. Этот формат используется, например, в Windows.
  • \mac:. текст хранится в кодировке Macintosh
  • \рс: для вывода текста используется кодировка символов IBM-PC.
  • \рса: IBM-PC Code Page 850 (модель PS\2).

Для передачи текстов между различными системами должна использоваться кодировка \ansi.

\colortbl

Windows и другие программы пользуются палитрами для определения используемых цветов. Чаще всего палитра состоит из 16 различных цветов, получаемых путем комбинации основных цветов - красного, зеленого и синего. Команда \colortbl позволяет изменить отдельные определения в палитре. Для каждого цвета в таблице указывается величина красной, зеленой и синей составляющей. Каждый цвет описывается тремя параметрами:

\red000 \green000 \blue000

Вместо 000 указывается величина доли цвета в диапазоне от 0 до 255. Пример: в таблице, состоящей из 16 цветов, должны быть заново определены цвета 0-й и 2-й. Для переопределения цветов может быть задана следующая последовательность:

{ \colortbl \red128\green64\blue128\;;\red0\green64\blue128; }

Определение цвета завершается точкой с запятой. Поскольку 1-й цвет остается без изменений, в последовательности два символа ";" следуют один за другим. Последовательность завершается закрывающей скобкой.

Оператор \cfn определяет цвет фона (при стандартной настройке n=0), а оператор \cbn - цвет символа (при стандартной настройке n=0).

\fonttbl

Данный оператор используется для построения таблицы шрифтов и соотносит имя шрифта (группы шрифтов) с номером шрифта. При определении шрифта можно использовать следующие операторы:

  • \fnil: имя группы шрифтов неизвестно. При выводе должен использоваться стандартный шрифт.
  • \froman: должны использоваться шрифты группы Roman (например, Times Roman)
  • \fswiss: этот оператор предписывает использование шрифтов из группы Swiss (Helvetica, Swiss и т.д.)
  • \fmodern: могут использоваться шрифты Pica, Elite и Courier.
  • \fscript: используются курсивные шрифты группы Script.
  • \fdecor: при указании этого оператора шрифты должны выбираться из группы Decor (Old English и т.д.).
  • \ftech: выбор группы шрифтов с техническими и математическими символами (SYMBOL и т.д.).

Команда для создания группы шрифтов может состоять из таких операторов:

{\fonttbl\f0\fnil default;} {\fl\froman roman h;} {\f2\fswiss helvetica;}

После ключевого слова \fonttbl следует первый номер шрифта \f0. Далее идет определение группы шрифтов. Здесь после номера 0 указано \fnil, т.е. имя группы неизвестно. Следующий параметр обозначает имя выбираемого шрифта (например, roman h). Указание default говорит считывающей программе о том, что следует использовать стандартный шрифт. После имени шрифта стоит точка с запятой. В приведенном примере определены только шрифты с номерами 1 и 2. Вся последовательность может быть объединена фигурными скобками в группу.

Таблица шрифтов должна быть заполнена значениями до того, как встретится оператор \stylesheet или текст. Стандартный шрифт вводится оператором \deffn.

\stylesheet

Этот оператор определяет шрифт абзаца, т.е. размер, начертание и имя гарнитуры, а также способ выравнивания текста абзаца. При этом используются два ключевых параметра:

  • \sbasedon000: вместо символов 000 указывается номер вида шрифта, который используется в качестве текущего.
  • \snext000: назначает номер следующего вида шрифта (style), который - станет текущим.

Оператор может иметь, например, следующий вид:

{\stylesheet\s0\f3\fs20\qj Normal;} {\sl\f3\fs30\b\qc Heading Level 3;}

Шрифты нумеруются числами от 0 до n (\s0... ). В первой строке стилю абзаца 0 (\s0 ) предписывается имя Normal. Вывод текста выполняется шрифтом 3 (\f3 ), размером 10 пунктов (\fs20 ). Параметр \qj говорит о том, что надпись должна выравниваться по формату. Вторая строка определяет стиль шрифта 1, который получает имя Heading Level 3 . Шрифт имеет размер 15 пунктов, жирное начертание (= bold ) и при выводе надпись центрируется (\qc ).

\pict

Этот оператор используется при описании рисунка в формате битовой карты (bitmap). Следующие параметры содержат описание рисунка в виде шестнадцатеричных значений. Параметры могут быть выборочно использованы для определения геометрии рисунка или его формата:

  • \pich000: оператор указывает высоту рисунка в пикселях. Вместо трех нулей подставляется числовое значение. Если оператор отсутствует, высота рисунка определяется из текущих графических данных. С помощью параметра можно задать для рисунка определенную высоту.
  • \piw000: оператор задает ширину рисунка в пикселях. Справедливо все, сказанное о предыдущем операторе.
  • \picscaled: с помощью этого оператора рисунок масштабируется таким образом, чтобы он точно заполнял отведенную для него область.
  • \wmetafilen: параметр указывает, что данные хранятся в формате Windows-метафайла. Параметр n определяет тип метафайла (1 = ММ-текст).
  • \macpict: параметр указывает, что данные хранятся в Macintosh-формате Quick-Draw.
  • \bin000:. параметр определяет количество байтов. Вместо трех нулей записывается шестнадцатеричное число.
  • \wbitmapn: параметр определяет формат bitmap-рисунка. Параметр n задает тип (0 соответствует логической битовой карте).
  • \brdrs: определяет простую рамку для рисунка
  • \brdrdb: определяет двойную рамку для рисунка.
  • \brdrth: определяет жирную линию для рамки рисунка.
  • \brdrsh: определяет затененную рамку для рисунка
  • \brdrdot: определяет для рисунка пунктирную линию.
  • \brdrhair: определяет тонкую линию для рамки рисунка.
  • \picwGoaln: задает желаемую ширину рисунка в twips
  • \pichGoaln: задает желаемую высоту рисунка в twips.
  • \picscalexn: задает горизонтальное масштабирование (n может принимать значения от 1 до 100, по умолчанию -10).
  • \picscaleyn: задает вертикальное масштабирование (n может принимать значения от 1 до 100, по умолчанию - 10).
  • \piccroptn: описывает верхнее поле рисунка в twips. При положительных значениях параметра n верхняя часть рисунка обрезается. Отрицательные значения n дают возможность построить вокруг рисунка рамку. Стандартное значение n равно 0.
  • \рiccrорbп: описывает нижнее поле рисунка в twips. При положительных значениях параметра n нижняя часть рисунка обрезается. Отрицательные значения n дают возможность построить вокруг рисунка рамку. Стандартное значение n равно 0.
  • \рiссrорrn: описывает правое поле рисунка в twips. При положительных значениях параметра n рисунок обрезается справа. Отрицательные значения n дают возможность построить вокруг рисунка рамку. Стандартное значение n равно 0.
  • \piccropln: описывает левое поле рисунка в twips. При положительных значениях параметра п рисунок обрезается слева. Отрицательные значения п дают возможность построить вокруг рисунка рамку. Стандартное значение п равно 0.
  • \wbmbitspixeln: определяет количество битов, приходящихся на пиксел, для bitmap-рисунка (стандартное значение равно 1).
  • \wbmplanesn: определяет количество битовых плоскостей (стандартное значение равно 1).
  • \wbmwidtbbytesn: определяет длину битовой карты в байтах

Самой частой причиной проблем с раскрытием файла RTF является просто отсутствие соответствующих приложений, установленных на Вашем компьютере. В таком случае достаточно найти, скачать и установить приложение, обслуживающее файлы в формате RTF - такие программы доступны ниже.

Поисковая система

Введите расширение файла

Помощь

Подсказка

Необходимо учесть, что некоторые закодированные данные из файлов, которые наш компьютер не читает, иногда можно просмотреть в Блокноте. Таким образом мы прочитаем фрагменты текста или числа - Стоит проверить, действует ли этот метод также в случае файлов RTF.

Что сделать, если приложение со списка уже было установлено?

Часто установленное приложение должно автоматически связаться с файлом RTF. Если это не произошло, то файл RTF успешно можно связать вручную с ново установленным приложением. Достаточно нажать правой кнопкой мышки на файл RTF, а затем среди доступных выбрать опцию "Выбрать программу по умолчанию". Затем необходимо выбрать опцию "Просмотреть" и отыскать избранное приложение. Введенные изменения необходимо утвердить с помощью опции "OK".

Программы, открывающие файл RTF

Windows
Mac OS
Linux
Android

Почему я не могу открыть файл RTF?

Проблемы с файлами RTF могут иметь также другую почву. Иногда даже установление на компьютере программного обеспечения, обслуживающего файлы RTF не решит проблему. Причиной невозможности открытия, а также работы с файлом RTF может быть также:

Несоответственные связи файла RTF в записях реестра
- повреждение файла RTF, который мы открываем
- инфицирование файла RTF (вирусы)
- слишком маленький ресурс компьютера
- неактуальные драйверы
- устранение расширения RTF из реестра системы Windows
- незавершенная установка программы, обслуживающей расширение RTF

Устранение этих проблем должно привести к свободному открытию и работе с файлами RTF. В случае, если компьютер по-прежнему имеет проблемы с файлами, необходимо воспользоваться помощью эксперта, который установит точную причину.

Мой компьютер не показывает расширений файлов, что сделать?

В стандартных установках системы Windows пользователь компьютера не видит расширения файлов RTF. Это успешно можно изменить в настройках. Достаточно войти в "Панель управления" и выбрать "Вид и персонализация". Затем необходимо войти в "Опции папок", и открыть "Вид". В закладке "Вид" находится опция "Укрыть расширения известных типов файлов" - необходимо выбрать эту опцию и подтвердить операцию нажатием кнопки "OK". В этот момент расширения всех файлов, в том числе RTF должны появится сортированные по названию файла.

Аббревиатура RTF обозначает «Rich Text Format», то бишь, «формат обогащённого текста». Или, попросту говоря, оформленного: с разными начертаниями, шрифтами, размерами и цветом букв. Во многих случаях этот формат, предназначенный для документов, может стать избавлением от неприятностей, поэтому получить о нём представление необходимо всем, кто пользуется компьютерами. Как всегда, в процессе знакомства с данным явлением непременно уделим внимание вопросам практичности.

Немножко истории

Дело было в старину, в 1982-м году. В те далёкие времена, когда фирмы Microsoft и Adobe дружили. Им понадобилось придумать что-нибудь для новой программы - текстового процессора Word для MS DOS, выпуск которого был запланирован на 1893-й.

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

С тех пор много чего изменилось, но суть осталась прежней: RTF - это текстовые файлы, подобно документам HTML. Их можно открывать в текстовых редакторах вроде Блокнота в Windows и Gedit в Ubuntu, чтобы посмотреть на все те тэги, ежели возникнет желание.

Вскоре пути Microsoft и Adobe разошлись, но формат остался проприетарным. (Adobe решили использовать концепцию для другого языка разметки, PostScript, что позже привело к появлению PDF .) Ну а Microsoft выпустили последнюю спецификацию RTF в марте 2008-го. На неё и ориентируется современный электронно-цифровой мир.

Суть вкратце

Структура документа RTF довольно проста. В начале текстового блока указывается управляющий символ, перед которым ставится «\» (в смысле, черта, наклонённая влево). В частности, \b перед блоком полужирного шрифта, \i перед курсивом, \par перед абзацем.

Для обозначения самих блоков, поскольку нет закрывающих тэгов, применяются фигурные скобки {}. Следовательно, выделенное полужирным в исходном тексте выглядит вот так: {\b выделенное полужирным} , а курсивом - вот так: {\i привет, мир!} Ну а в самом начале указывается сам формат \rtf1:

{\rtf1 \par {\i Привет, мир!} Только что было приветствие курсивом. А теперь {/b немножко полужирного текста}. \par }

Это, конечно, очень простой пример. На самом деле через косые линии в ряд выстраивается изрядное количество всяких параметров: кодировка, язык и прочие данные. Что-нибудь вроде:

{\rtf1\ansi\deff3\adeflang1025 {\fonttbl{\f0\froman\fprq2\fcharset0 Times New Roman;} \par {\i Привет, мир, ещё раз!} Как видите, абракадабры {/b предостаточно} даже в маленьком фрагменте. \par }

Особенно много управляющих символов любят вставлять мощные текстовые процессоры вроде того же Word или LibreOffice Writer, размечая всё слишком уж дотошно.

Кроме того, русские буквы заменяются обозначениями байтов - символов кодировки (в примерах ради наглядности замена не показана). Это делает исходный код совершенно непригодным для чтения и раздувает его непомерно.

Софт

Кроме упомянутых выше Microsoft Word и LibreOffice Writer, существует множество менее мощных программ, RTF-редакторов. Однако далеко не все из них пригодны для работы.

FocusWriter - пожалуй, самый лучший из нынешних свободных RTF-редакторов. Можно прикручивать словари для проверки орфографии, используемые в LibreOffice Writer. И в Windows, и в Ubuntu работает очень шустро, занимает мало места и системные ресурсы не пожирает. Оформление интерфейса меняется на разные вкусы.

Упрямо запоминает и пытается при старте загрузить последний открывавшийся документ - пожалуй, это всё же недостаток. Предназначен, в первую очередь, для писателей , работающих над одной книгой, а не над несколькими сразу. В соответствии с той же концепцией панель инструментов прячется до наведения указателя мыши, чтобы ничто от работы не отвлекало.

Зато такой интерфейс очень удобен на нетбуках и прочих устройствах с небольшим дисплеем. Писать статьи, письма и всякие заметки - одно удовольствие.

Зачем нужен RTF

Во-первых, текстовые файлы не заражаются вирусами, и в них невозможно запихнуть вредоносные макросы. Файлы *rtf совершенно безопасны, как и *txt. А вот *doc вполне способны преподнести неприятные сюрпризы.

Во-вторых, Rich Text Format понимают все современные текстовые процессоры и, конечно, RTF-редакторы во всех популярных операционных системах.

Ваш покорный слуга собственными глазами видел, как Word 2010 в Windows 7 наотрез отказался открывать *odt, изготовленный в LibreOffice. Сказал, мол, в файле содержится какая-то ошибка. Пришлось нести флэшку обратно на компьютер с Ubuntu (благо таковой находился в соседнем офисе) и конвертировать документ в RTF. После чего Word открыл файл без возражений.

Как с этим жить

Небольшие русскоязычные документы, страниц на десять-пятнадцать, можно сохранять в RTF смело. Места они займут немного, по современным меркам. А вот файлы *rtf с целыми романами раздуются неимоверно и при открытии потребуют изрядной нагрузки на процессор. Потому что буквы русского алфавита замещаются обозначениями байт кодировки, как сказано ранее.

Предположим, во время работы в Ubuntu вам нужно быстро сохранить небольшой текст, который потом понадобится открыть в Windows. Если вы создадите *txt в Gedit, то Блокнот, вполне вероятно, вместо букв покажет нечто инопланетное, не распознав кодировку автоматически.

Но если вы используете шустрый FocusWriter и изготовите *rtf, проблем не возникнет, всё отобразится нормально. Кодировка будет указана в исходном коде после \rtf1 .

Резюмируем

Итак, Rich Text Format (он же RTF) отличается универсальностью и потому пригоден для создания и открытия оформленных текстов в разных операционных системах. Однако его лучше использовать только для небольших русскоязычных документов. Для англоязычных (и прочих с латинскими буквами) проблемы раздувания файлов нет.

В жизни всякое бывает, и если вдруг понадобится открыть документы в пока ещё популярной Windows, то на этот случай важные файлы, которые вы в Ubuntu держите в *odt, можно продублировать в *rtf. Потому что на компьютерах с ОС от Microsoft нередко присутствует Word, а не LibreOffice Writer.

Предыдущие публикации:

Что ж продолжим наши изыскания на предмет получения текста из различных форматов данных. Не так давно мы с вами научились вытаскивать текст из zipped-xml-based файлов (odt и docx), а также, в начале этой недели, из pdf . Сегодня мы продолжим с обещанным rtf.

Rich Text Format (он же rtf), вы могли бы подумать, достаточно забытый, хотя и не очень сложный формат представления текстовых данных. Что ж, относительно несложный для получения текста, но за свою историю: от своей первой версии до текущей 1.9.1 - он приобрёл под 300 страниц официально документации и огромное количество надстроек, которые в большей степени нам будут мешать при получении plain text"а. Попробуем их обойти...

А что там внутри?

Как уж повелось давайте заглянем вовнутрь rtf-файла и посмотрим, что там внутри:

Что мы видим? Я вижу наше любимое стихотворение «Парус». Мы видим изначально текстовый 8-битный формат данных. Это уже радует - когда в исходных данных текст, понимать, что происходит, гораздо проще. Теперь давайте разберёмся, как эти самые данные прочитать. Для этого я расскажу немного теории по теме.

Будем считать, что rtf состоит из управляющих слов , которые могут быть сгруппированы во вложенные множества. Управляющие слово начинается на обратный слэш (\), группа обёрнута в фигурные скобки ({ и }).

Управляющие слово состоит из последовательности букв английского алфавита (от a до z) и может быть завершено численным параметром (возможно отрицательным). Как вариант, слово может содержать один не цифро-буквенный ascii-символ. Всё, что не подпадает под эти правила, не является частью управляющего слова. Таким образом, последовательность вида \rtf1\ansi\ansicpg1251 без проблем делится на три слова rtf с параметром 1 (major-версия формата), ansi (текущая кодировка) и ansicpg с параметром 1251 (текущая кодовая страница под номером 1251 - т.е. Windows-1251).

Группированные множества определяют область действия управляющих слов. Таким образом, управляющие слова описанные внутри фигурных скобок работают только внутри них и всех дочерних подмножеств. Для того, чтобы правильно отработать какие слова имеют место сейчас - требуется вести стек управляющих слов. При открытии фигурной скобки создавать новый элемент-массив в стеке, в который сразу же добавлять данные предыдущего слоя стека, при закрытии скобки - удалять самый верхний слой.

Ещё стоит отметить, что некоторые управляющие слова могут быть закрыты с помощью добавления параметра ноль, а не создания новой подгруппы. Например, следующие варианты эквивалентны: This is {\b bold} text , This is \b bold \b0 text = This is bold text .

Откуда брать текст?

С устройством нового для нас формата мы познакомились, теперь зададимся вопросом, а где брать текст. Тут всё не так сложно, как может показаться - текст надо брать там, где текущая последовательность не идентифицируется, как управляющее слово. С парой исключений, естественно.

Во-первых, стоит отметить, что исходная кодировка rtf-файла - это ANSI, поэтому без всякий изысков сохранится только, английский текст. Нас же интересует, как минимум, русский текст, а ещё лучше Unicode, не так ли? Что правда, то правда - rtf хоть и старый формат, но сгодится на сохранение и того и другого.

Итак, в rtf"е есть возможность использования второй половины таблицы ASCII, та что от 128 и выше. С учётом текущей кодировки (выше управляющее слово \ansicpg), конечно же. Для этого в RTF была введена последовательность вида \"hh , где hh - это двоичный hex-код символа из таблицы ASCII.

Ну и второй, более интересный вариант, это unicode-кодированные данные. Для них в формат включено лаконично короткое ключевое слово \uABCD с цифровым параметром ABCD. ABCD в данном случае код unicode-символа в десятичной системе счисления. Всё опять просто, как вы могли заметить.

Просто, да не очень. В rtf существует ещё одно ключевое слово \ucN , которое тесно связано с Unicode. Дело в том, что формат RTF очень рьяно поддерживает совместимость со старыми устройствами, на которых возможно придётся открывать данный файл. Как вариант, подобное устройство (ну например компьютер с Windows 3.11:) не сможет прочитать Unicode, что ему делать? Для этого после каждого unicode-символа, шифрованного ключевым словом \u может быть указано от нуля до нескольких символов, которые должны быть отображены в случае, если rtf-viewer не способен отобразить или разобрать текущие данные (по документации, если просмотрщик не может отобразить верно данные, он должен их пропустить).

В связи с этим, большинство современных редакторов после unicode-управляющего слова ставят символ вопроса, как знак, что требуется показать вместо текущего символа. Но возможны и варианты, например: Lab\u915GValue . Зададимся вопросом - сколько символов требуется отобразить, если нет возможности показать Unicode. Всё опять же не очень сложно - указанное выше ключевое слово \ucN в качестве параметра N как раз и предоставляет это значение. Т.е. перед Unicode-данными обязательно появится что-то типа \uc1 , что скажет нам пропустить один символ после unicode"а.

Давайте почитаем!

Похоже, что накопленных нами данных будет достаточно, чтобы прочитать наши первые rtf-файлы. Поехали:
  1. function rtf_isPlainText($s ) {
  2. $failAt = array ("*" , "fonttbl" , "colortbl" , "datastore" , "themedata" ) ;
  3. for ($i = 0 ; $i < count ($failAt ) ; $i ++ )
  4. if (! empty ($s [ $failAt [ $i ] ] ) ) return false ;
  5. return true ;
  6. function rtf2text($filename ) {
  7. $text = file_get_contents ($filename ) ;
  8. if (! strlen ($text ) )
  9. return "" ;
  10. $document = "" ;
  11. $stack = array () ;
  12. $j = - 1 ;
  13. for ($i = 0 ; $i < strlen ($text ) ; $i ++ ) {
  14. $c = $text [ $i ] ;
  15. switch ($c ) {
  16. case "\\ " :
  17. $nc = $text [ $i + 1 ] ;
  18. if ($nc == "\\" && rtf_isPlainText($stack [ $j ] ) ) $document .= "\\" ;
  19. elseif ($nc == "~" && rtf_isPlainText($stack [ $j ] ) ) $document .= " " ;
  20. elseif ($nc == "_" && rtf_isPlainText($stack [ $j ] ) ) $document .= "-" ;
  21. elseif ($nc == "*" ) $stack [ $j ] [ "*" ] = true ;
  22. elseif ($nc == """ ) {
  23. $hex = substr ($text , $i + 2 , 2 ) ;
  24. $document .= html_entity_decode ("" . hexdec ($hex ) . ";" ) ;
  25. $i += 2 ;
  26. } elseif ($nc >= "a" && $nc <= "z" || $nc >= "A" && $nc <= "Z" ) {
  27. $word = "" ;
  28. $param = null ;
  29. for ($k = $i + 1 , $m = 0 ; $k < strlen ($text ) ; $k ++, $m ++ ) {
  30. $nc = $text [ $k ] ;
  31. if ($nc >= "a" && $nc <= "z" || $nc >= "A" && $nc <= "Z" ) {
  32. if (empty ($param ) )
  33. $word .= $nc ;
  34. else
  35. break ;
  36. } elseif ($nc >= "0" && $nc <= "9" )
  37. $param .= $nc ;
  38. elseif ($nc == "-" ) {
  39. if (empty ($param ) )
  40. $param .= $nc ;
  41. else
  42. break ;
  43. } else
  44. break ;
  45. $i += $m - 1 ;
  46. $toText = "" ;
  47. switch (strtolower ($word ) ) {
  48. case "u" :
  49. $toText .= html_entity_decode ("" . dechex ($param ) . ";" ) ;
  50. $ucDelta = @ $stack [ $j ] [ "uc" ] ;
  51. if ($ucDelta > 0 )
  52. $i += $ucDelta ;
  53. break ;
  54. case "par" : case "page" : case "column" : case "line" : case "lbr" :
  55. $toText .= "\n " ;
  56. break ;
  57. case "emspace" : case "enspace" : case "qmspace" :
  58. $toText .= " " ;
  59. break ;
  60. case "tab" : $toText .= "\t " ; break ;
  61. case "chdate" : $toText .= date ("m.d.Y" ) ; break ;
  62. case "chdpl" : $toText .= date ("l, j F Y" ) ; break ;
  63. case "chdpa" : $toText .= date ("D, j M Y" ) ; break ;
  64. case "chtime" : $toText .= date ("H:i:s" ) ; break ;
  65. case "emdash" : $toText .= html_entity_decode ("—" ) ; break ;
  66. case "endash" : $toText .= html_entity_decode ("-" ) ; break ;
  67. case "bullet" : $toText .= html_entity_decode ("•" ) ; break ;
  68. case "lquote" : $toText .= html_entity_decode ("‘" ) ; break ;
  69. case "rquote" : $toText .= html_entity_decode ("’" ) ; break ;
  70. case "ldblquote" : $toText .= html_entity_decode ("«" ) ; break ;
  71. case "rdblquote" : $toText .= html_entity_decode ("»" ) ; break ;
  72. default :
  73. $stack [ $j ] [ strtolower ($word ) ] = empty ($param ) ? true : $param ;
  74. break ;
  75. if (rtf_isPlainText($stack [ $j ] ) )
  76. $document .= $toText ;
  77. $i ++;
  78. break ;
  79. case "{" :
  80. array_push ($stack , $stack [ $j ++ ] ) ;
  81. break ;
  82. case "}" :
  83. array_pop ($stack ) ;
  84. $j --;
  85. break ;
  86. case "\0" : case "\r" : case "\f" : case "\n" : break ;
  87. default :
  88. if (rtf_isPlainText($stack [ $j ] ) )
  89. $document .= $c ;
  90. break ;
  91. return $document ;
Код с комментариями вы можете получить на