Данный файл является частью Руководства по TADS для авторов игр.
Copyright © 1987 - 2002 Майкл Дж. Робертс (Michael J. Roberts). Все права защищены.

Руководство было преобразовано в формат HTML Н. К. Гайем (N. K. Guy), компания tela design.

Перевод руководства на русский язык - Валентин Коптельцев


Приложение L


Использование и создание кодовых страниц в TADS

В целях обеспечения возможности использования разных наборов символов современные компилятор TADS, интерпретатор, а также отладчик/среда разработки (в том числе мультимедийные версии) теперь позволяют указывать кодовую страницу, которая будет использоваться в игре. Кодовая страница позволяет играм использовать стандартизованный набор символов (например, ISO Latin 1), но при этом, тем не менее, корректно отображаться в операционной системе любой локализации за счет обеспечения соответствия между внутренним набором символов игры и набором символов операционных систем.

(Примечание переводчика: данная тема актуальна в основном с точки зрения запуска русскоязычных игр в интерпретаторе командной строки, для HTML TADS таких проблем не будет. Кроме того, в данном тексте словосочетания "набор символов" и "кодовая страница" используются как синонимы.)

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

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

Содержание:




Краткий справочник по наборам символов в TADS

В данном разделе представлены ответы на наиболее частые вопросы, возникающие в связи с использованием наборов символов в TADS.

Я скачал игру на TADS и хочу в нее поиграть (используя интерпретатор командной строки). Нужно ли мне знать, какой набор символов она использует?

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

(Примечание переводчика: Увы, на деле не всё так радужно. Эксперименты с русскоязычными играми, созданными в кодировке Windows, показали, что интерпретатор командной строки запускает их без всяких дополнительных сообщений, отображая при этом "кракозябры" вместо букв).

Я пытаюсь запустить игру с использованием интерпретатора TADS для командной строки и получаю следующее сообщение об ошибке: character table file "xyz.tcp" not found for internal character set "ISO-Latin-n (ISO-8859-m)" (для внутреннего набоора символов "ISO-Latin-n (ISO-8859-m)" не найден файл таблицы символов "xyz.tcp"). (Вариант для русскоязычных игр: я запускаю игру, а вместо букв на экран выводятся непонятные символы-"кракозябры").

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

У вас есть несколько возможностей. Самая простая состоит в простом игнорировании интепретатором TADS преобразования набора символов; для этого запустите игру повторно, указав в командной строке опцию "-ctab-":

    tr -ctab- foo.gam

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

Далее, вы можете попытаться найти подходящий файл таблицы символов, указанный в сообщении об ошибке. Вы можете поспрашивать в новостных группах rec.arts.int-fiction, rec.games.int-fiction, а также поискать этот файл в IF-архиве или просто в поисковике.

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

Я автор игры и хочу использовать в ней расширенный набор символов. Что мне для этого нужно?

Вам следует воспользоваться функционалом перекодировки наборов символов.

Прежде всего вам необходимо выбрать внутренний набор символов для вашей игры. Для русскоязычных игр это будет Windows-1251 (см. далее).

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

Наконец, вам потребуется найти нужный файл таблицы преобразования символов. Название этого файла прежде всего зависит от вашей системы и требуемой кодовой страницы.

Наконец, при компиляции игры укажите файл трансляции кодовой страницы следующим образом:

    tc -ctab xyz.tcp mygame.t

Надо ли мне прикладывать файлы преобразования кодовых страниц к моей игре?

Нет. Файлы трансляции кодовых страниц являются частью системы TADS, а не вашей игры.

В то же время, если вы выкладываете в публичный доступ версию игры, скомпилированной в виде исполняемого файла, прикладывать файлы .TCP для вашей операционной системы придется. (Правда, если скомпилировать таким образом рускоязычную игру под Windows с использованием HTML TADS, проблем, как правило, не возникает и без приложения файлов .TCP).

Могу ли я использовать наборы символов ISO 8859, не основанные на латинском языке (например, с греческим шрифтом или кириллицей)?

Да. Хотя в этом документе в большинстве примеров используются наборы символов ISO Latin-1 и ISO Latin-2, вы можете использовать в качестве внутренней любую 8-битную кодировку семейства ISO 8859 при условии, что они используют написание слева направо.

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

Нужного мне файла таблицы трансляции кодовых страниц не существует. Есть ли возможность сравнительно простого его создания?

Да. Хотя TADS не может использовать уникод напрямую, он может использовать его в качестве промежуточного звена при преобразовании наборов символов. Уникодовые таблицы соответствия доступны для всех наборов символов семейства ISO 8859, а также для достаточного количества других. Подробнее см. в соответствующем разделе.


Общие сведения о кодовых страницах



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

Обзор переносимости кодовых страниц

Авторы-пользователи TADS неоднократно просили разработчика обеспечить более широкую поддержку для неанглийских игр. Одним из важнейших требований, которые предъявляются к таким играм - это поддержка символов из так называемого "расширенного" набора, т. е. не являющимися стандартными для английского языка.

TADS уже в течение долгого времени позволял задействовать в играх полный "8-разрядный" набор символов, который используются современными системами для представления нестандартных с точки зрения англоязычного пользователя символов; таким образом, уже довольно давно существовала возможность писать игры, которые использовали бы расширенный набор символов, скажем, для компьютеров "Макинтош".

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

Особенно раздражает в этой несовместимости то, что многие символы расширенного набора, определенные для одной системы, как правило, определены и для других - просто они расположены в разных местах того или иного расширенного набора. Например, и PC-совместимые компьютеры, и "Макинтоши" в состоянии отобразить букву ё, однако размещают её в разных позициях своих расширенных наборов. Это означает, что текстовый файл, созданный на компьютере одной системы, окажется нечитаемым на компьютере другой системы, поскольку в файле, по сути, просто содержатся коды символов, принятые в одной системе, а в другой системе эти же коды соответствуют другим символам.

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

Преобразование кодовых страниц

Для решения проблемы переносимости символов из расширенных наборов в TADS используется способ, известный как трансляция или отображение. Каждый символ расширенного набора исходного компьютера преобразуется TADS в код, соответствующий позиции этого символа в расширенном наборе "целевого" компьютера. Преобразование происходит динамически в ходе выполнения игры; таким образом, файл .GAM будет работать на любой платформе, и перекомпилировать сам этот файл не потребуется.

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

Данные Источник данных Кодовая страница
Исходный код Ваш текстовый редактор Нативная кодовая страница вашего компьютера
Файл .GAM Компилятор TADS: компилятор преобразует исходный код вашей игры в двоичный формат файла .GAM, транслируя символы во внутреннюю кодовую страницу по вашему выбору Одна из стандартных внутренних кодовых страниц TADS по вашему выбору
Текст, выводимый на экран компьютера игрока Интерпретатор TADS: интерпретатор выполняет код скомпилированной игры и преобразует символы, сохраненные в файле .GAM, в нативную кодовую страницу компьютера игрока Нативная кодовая страница компьютера игрока

Выбор внутренней кодовой страницы

Для использования механизма преобразования кодовой страницы в первую очередь необходимо принять решение по поводу внутренней кодовой страницы вашей игры. (Это та страница, которая будет использоваться в скомпилированном файле .GAM игры). Хотя вы можете выбрать любую восьмибитную страницу, настоятельно рекомендуется использовать одну из стандартизованных международных страниц, таких как ISO 8859-X. Это упростит игрокам задачу поиска подходящей таблицы преобразования символов.

Очевидно, что если бы каждый автор игры создавал свою собственную кодовую страницу, у игроков возникали бы огромные проблемы. Для каждого типа компьютеров, на которых игроки потенциально могут запустить игру, кто-то должен создать таблицу преобразования символов из используемой автором внутренней страницы к нативной странице, используемой на машине игрока. Если бы авторы использовали для создания игры нестандартные кодовые страницы, количеcтво требуемых таблиц преобразования выросло бы до совершенно невероятных пределов.

Таким образом, выбор стандартизированной кодовой страницы практически предрешен. Для русскоязычных игр рекомендуется страница Windows-1251 (см. далее).

Идентификаторы и "длинные имена" кодовых страниц

Каждая внутренняя кодовая страница имеет уникальный универсальный идентификатор, а также "длинное" (или "полное") имя, которое используется в описательных целях. Идентификатор назван "универсальным", поскольку он должен быть одинаковым для любой операционной системы; причиной этого является то, что именно на основании идентификатора принимается решение о том, как именно будут преобразовываться символы внутренней кодовой страницы в нативную кодовую страницу. Если бы идентификаторы были разными для разных платформ, то определить необходимый алгоритм трансляции символов при переходе с одной платформы на другую было бы невозможно.

Для обеспечения уникальности и универсальности идентификаторов каждой кодовой страницы эти внутренние кодовые страницы должны быть зарегистрированы и внесены в так называемый мастер-список. Сверяясь с этим списком, для любой операционной системы можно определить кодовую страницу, ассоциированную с тем или иным идентификатором, что исключает разночтения относительно кодовой страницы игры. В настоящее время мастер-список администрируется Майком Робертсом (Mike Roberts) (mjr_@hotmail.com); если требуется копия списка или необходимо добавить в список новую кодовую страницу, следует обращаться к нему.

На данный момент в мастер-списке зарегистрированы следующие внутренние кодовые страницы:

При создании файла преобразования кодовой страницы вам необходимо указать идентификатор (ID) и "длинное" описание (LDESC). При компиляции игры с использованием соответствующей таблицы преобразования компилятор сохранит эти значения в файле игры .GAM. Позже, когда игрок будет запускать игру при помощи программы-интерпретатора, интерпретатор считает идентификатор и "длинное" описание и попытается загрузить нужную таблицу преобразования символов. Если эта попытка окончится неудачно, будет выведено сообщение об ошибке с указанием "длинного" описания кодовой страницы; эта информация упростит игроку поиск нужного файла таблицы преобразования.

Интерпретатор TADS использует принятые для конкретной операционной системы правила для того, чтобы определить файл таблицы преобразования символов. Эти правила зависят от представления нативных кодовых страниц в той или иной ОС.

Для DOS интерпретатор определяет действующую кодовую страницу (для этой ОС кодовые страницы обозначаются трех- или четырехзначными числами), после чего соединяет номер кодовой страницы и идентификатор внутренней кодовой страницы, после чего добавляет расширение ".TCP". Например, файл для преобразования кодовой страницы ISO Latin-2 в кодовую страницу DOS 852 будет иметь название "852La2.TCP".

Под Windows мультимедийный интерпретатор HTML TADS выбирает файл с названием WIN_xxx.TCP, где xxx - это идентификатор внутренней кодовой страницы. Например, файл для ISO Latin-2 будет именоваться "WIN_La2.TCP". Под Windows TADS выбирает нужный набор символов на основе кодовой страницы, сохраненной в файле .TCP, поэтому указывать идентификатор этой кодовой страницы в названии данного файла. (Примечание переводчика: на практике проблем с отображением кириллицы в мультимедийной версии TADS под Windows проблем нет.)

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

Дополнительная информация о системе

Исходный файл таблицы преобразования может содержать еще одну запись - строковое поле с дополнительной информацией о системе. Эта информация является чисто служебной и используется версией програмы-интерпретатора TADS под ту или иную операционную систему.

Значение задается следующим образом:

   EXTRA_SYSTEM_INFO = 1250

Интерпретация этого значения (в данном случае "1250") зависит от используемой операционной системы.

Под DOS данное поле не используется.

Для Windows мультимедийный интерпретатор HTML TADS воспринимает дополнительную информацию о системе как номер кодовой страницы Windows. Загрузив файл таблицы преобразования, HTML TADS считывает данное строковое значение и затем подбирает кодовую страницу Windows с соответствующим номером.

Зачем всё это нужно? Почему бы просто не использовать кодовую страницу пользовательского компьютера?

Использовать кодовую страницу компьютера (если только на нем не используется одна из кодировок семейства ISO 8859) не следует по тем же причинам, почему не стоит создавать свои собственные кодировки: весьма желательно сократить до минимума общее количество различных кодовых страниц, используемых играми на TADS, чтобы уменьшить и число необходимых для запуска игры под различными ОС файлов таблиц преобразования.

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

Обратите внимание, что Windows не использует кодовые страницы семейства ISO 8859. Многие люди искренне считают, что кодовые страницы Windows совпадают с кодовыми страницами ISO 8859, но это не так. На самом деле в Windows используются надмножества кодовых страниц этого семейства; иными словами, не все символы, которые есть в кодировках Windows, присутствуют и в кодировках ISO 8859.

Почему бы не использовать уникод?

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

TADS не может использовать уникод напрямую. В то же время утилита TADS для конвертации кодовых страниц может использовать наборы символов уникода в качестве промежуточных при трансляции двух кодировок, не относящихся к уникоду. Это дает возможность значительно упростить процесс перекодировки. Более подробная информация приведена в разделе Использование таблиц трансляции формата уникод.

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

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

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

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

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


Использование таблиц преобразования символов

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

Компиляция с использованием таблицы преобразования

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

    tc -ctab mymap.tcp mygame.t

Файл таблицы преобразования является отдельным файлом, в котором задается соответствие между символами кодовых страниц исходников и игры. Компилятор TADS, считывая символы исходного кода, будет перекодировать их на основании данных таблицы преобразования.

Запуск интерпретатора с использованием таблицы преобразования

Наконец, каждый раз при запуске вашей игры игроком программа-интерпретатор должна будет выбрать подходящую для его (игрока) операционной системы таблицу преобразования. В идеале процесс преобразования кодировок должен быть абсолютно незаметен для игрока. Компилятор TADS сохраняет идентификатор внутренней кодовой страницы игры в файле .GAM; когда игрок запускает игру, интерпретатор TADS считывает этот идентификатор и пытается найти подходящий для компьютера игрока файл таблицы преобразования. При наличии такого файла он будет выбран автоматически.

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

Игроки имеют возможность принудительно выбрать определенный файл таблицы преобразования, используя опцию -ctab интерпертатора, либо вовсе отказаться от преобразования кодовых страниц, задав -ctab-. Команда с опцией -ctab может выглядеть так:

    tr -ctab playmap.tcp mygame.gam

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

(Примечание переводчика: как я уже говорил ранее, на самом деле всё не так просто - эксперименты показали, что интерпретатор TADS командной строки не распознает автоматически кириллическую кодовую страницу игры. Иными словами, для русскоязычных игр опцию -ctab потребуется указывать в любом случае).


Создание файла таблицы преобразования символов

В связи со сравнительной новизной средства преобразования кодовых страниц в настоящее время в составе дистрибутива TADS (версия 2.5.14) поставляются всего две таблицы трансляции символов:

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

Примечание переводчика: в рамках работы над переводом данной главы был создан файл 8661251.tcp для взаимного преобразования кодовых страниц DOS 866 и Windows CP-1251. Архив с исходником и скомпилированной таблицей преобразования можно скачать здесь.

Для создания файла трансляции используется утилита под названием MKCHRTAB32 (входит в дистрибутив TADS, исполняемый файл располагается в установочном каталоге TADS). Утилита считывает специальный исходный файл, создаваемый при помощи текстового редактора, и генерирует на его основе таблицу преобразования кодировок, которую можно задать при помощи опции -ctab для компилятора или интерпретатора TADS. Создав такую таблицу один раз, вы можете использовать ее со всеми компонентами, входящими в дистрибутив TADS.

Утилита MKCHRTAB32 запускается из командной строки следующим образом:

    mkchrtab32 исходный_файл таблица_преобразования

, где исходный_файл - это текстовый файл, порядок создания которого описан ниже, а таблица_преобразования - название файла таблицы трансляции символов, которое вы будете указывать в опции -ctab компилятора/интерпретатора.

Формат исходного файла для таблиц преобразования

Каждая строка исходного файла определяет соответствие между парой символов из двух разных кодовых страниц. Пустые строки, а также строки, начинающиеся со знака решетки ("#"), игнорируются.

В дополнение к собственно списку соответствия кодовых страниц исходный файл обязательно должен содержать два специальных определения: идентификатор внутренней кодовой страницы и ее полное имя. Эти определения выглядят следующим образом:

Поля ID и LDESC хранятся в файле преобразования кодовых страниц. При компиляции игры с использованием данной кодовой страницы их значения будут сохранены в скомпилированном файле .GAM, и программа-интерпретатор сможет определить, какую кодовую страницу требуется загружать при запуске игры.

Обратите внимание, что нативная кодовая страница в файле не определена, так как в этом нет необходимости. Вся идея преобразования кодовых страниц заключается в том, чтобы игры не были привязаны к кодовой странице того или иного конкретного пользовательского компьютера.

Использование таблиц трансляции формата уникод

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

Хотя напрямую использовать уникод в качестве внутренней кодовой страницы в TADS не удастся, утилита преобразования кодовых страниц может использовать уникод в качестве промежуточной кодировки для создания таблицы преобразования, что значительно упрощает весь процесс.

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

Организация "Консорциум Уникода", занимающаяся разработкой и публикацией данного стандарта, создала большой набор трансляционных таблиц, осуществляющих преобразование других кодировок в уникод. Эти таблицы доступны для скачивания и имеют простой текстовый формат. Утилита преобразования кодировок TADS может использовать их напрямую.

Уникодовые трансляционные таблицы не включены в дистрибутив TADS в связи с лицензионными ограничениями (запрещено их распространение сторонними лицами/организациями), однако их свободно можно скачать на сайте уникода по адресу ftp://ftp.unicode.org/Public/MAPPINGS.

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

Затем создается файл таблицы преобразования, в котором определяются значения ID и LDESC.

Далее вместо того, чтобы указывать соответствия пар символов явным образом, можно просто дать ссылку на трансляционную таблицу уникода - примерно так:

    unicode native="native-mapping" internal="internal-mapping"

Наконец, необходимо указать символы, подставляемые по умолчанию, используя инструкции NATIVE_DEFAULT и INTERNAL_DEFAULT. Это позволит подобрать эквиваленты для символов, которые присутствуют только в одной из транслируемых кодировок.

В результате у вас получится готовый исходный файл таблицы преобразования кодовой страницы. Чтобы создать файл .TCP, используйте утилиту MKCHRTAB32. Обратите внимание, что утилита автоматически преобразует с использованием уникодовой таблицы в том числе и нестандартные символы HTML.

Также имейте в виду, что вам может потребоваться самостоятельно указать ряд соответствий символов в явной форме в тех случаях, когда для символа отсутствует прямой эквивалент в другой кодировке. Например, кодовая страница 437 для DOS не содержит символов с ударением, имеющихся в кодировке ISO Latin-1, поэтому логично дополнить уникодовую трансляционную таблицу, определив в качестве эквивалентов для символов с ударением аналогичные символы, но без ударения.

Указание подстановки символов по умолчанию

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

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

    native_default = character
    internal_default = character

Инструкция NATIVE_DEFAULT определяет символ, на который должны заменяться все символы внутренней кодовой страницы, для которых не определены эквиваленты в нативной кодовой странице. Символ определяется в виде числа (кода) в десятичном, шестнадцатиричном или восьмеричном формате, либо в виде символьной переменной, заключенной в апострофы. Аналогично, инструкция INTERNAL_DEFAULT определяет символ по умолчанию для обратного направления трансляции.

Обратите внимание, что эти инструкции будут применены только к символам с кодами в интервале от 128 до 255. В интервале кодов от 1 до 127 символы совпадают для подавляющего большинства кодировок, и транслировать их нет необходимости.

Разумеется, использование инструкций для определения подстановочных символов по умолчанию не является обязательным; вместо них вы можете определить соответствие для каждого символа по отдельности.

Определение соответствия пар символов

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

Во-первых, соответствие может быть двусторонним:

   152 <-> 201

Первое значение - это код, соответствующий символу в нативной кодовой странице компьютера; второе - код согласно стандартизованной внутренней кодовой странице. В ходе компиляции игры компилятор будет заменять в результирующем файле .GAM символ с кодом 152 на символ с кодом 201. Когда игра запускается в интерпретаторе с использованием данной таблицы, он будет вместо символов с кодом 201 выводить символ с кодом 152.

Во-вторых, соответствие может быть прямым односторонним:

   160 -> 255

В данном случае символ с кодом 160 нативной кодовой страницы будет заменяться на символ с кодом 255 во внутренней кодовой странице, при этом обратная трансляция символа с кодом 255 не определяется. Такое определение пары символов полезно в случаях, когда для символов одной кодовой страницы не существует эквивалента в другой кодовой странице. При этом во внутренней кодовой странице выбирается один "мусорный" символ, на который "перенаправляются" все не имеющие эквивалента символы нативной кодовой страницы.

В-третьих, можно определить обратное одностороннее соответствие:

   128 <- 220

При этом символ с кодом 220 внутренней кодовой страницы будет транслироваться в символ с кодом 128 нативной кодовой страницы. Применение данного вида соответствия в целом аналогично прямому одностороннему соответствию, за тем исключением, что оно используется для символов из внутренней кодовой страницы, не имеющих эквивалентов в нативной кодовой странице.

Наконец, можно определить трехстороннее соответствие:

   161 -> 255 -> 128

При этом символ с кодом 161 нативной кодовой страницы будет транслироваться в символ с кодом 255 внутренней кодовой страницы, а тот, в свою очередь, будет преобразован в символ с кодом 128 нативной кодовой страницы. Такой способ определения соответствия также используется для трансляции символов, не имеющих эквивалентов в одной из кодовых страниц.

Коды символов можно задавать в шестнадцатиричном и восьмеричном формате. Для указания шестнадцатиричного формата перед числом ставится "0x":

  0xf3 <-> 0x85

Для указания восьмеричного формата запись числа следует начинать с нуля:

  0172 <-> 0157

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

  'c' <-> 0x94

Однако символьные значения следует использовать только для символов в диапазоне ASCII, поскольку в противном случае ваша таблица преобразования перестанет быть переносимой.

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

Трансляция нестандартных символов HTML

Файл таблицы преобразования кодовых страниц позволяет также указать, каким образом осуществляется трансляция нестандартных символов HTML (так называемых "&"-последовательностей) в интерпретаторе TADS без поддержки мультимеджийных возможностей. Причина, по которой требуется указывать соответствия для этих символов, состоит в том, что эти символы могут не иметь прямого эквивалента во внутренней кодовой странице, поскольку принадлежат кодовому пространству уникода, которое "не втиснуть" в 8-битную кодировку, используемую в TADS.

Для нестандартных символов HTML указываются эквиваленты непосредственно в нативной кодовой странице, внутренняя кодовая страница остается незадействованной. Формат записи в таблице трансляции при этом отличается от принятого для преобразования обычных символов нативной и внутренней кодировок:

   &название-HTML-символа = нативный-символ [нативный-символ ...]

Название-HTML-символа - это обозначение символа HTML; например, последовательность "&Auml" обозначает в HTML заглавную букву "A" с двумя точками (Ä). Значения нативный-символ определяют символы нативной кодовой страницы и могут быть десятичными, шестнадцатиричными либо восьмеричыми числами, а также символьными переменными, заключенными в апострофы.

Обратите внимание, что HTML-символу может соответствовать один или более символов нативной кодовой страницы. Это связано с тем, что для некоторые символы HTML передаются несколькими обычными символами. Например, значок копирайта заменяется строкой "(c)". Другие примеры определений многосимвольных эквивалентов для символов HTML (для кодовой страницы DOS 437):

   &copy = '(' 'c' ')'
   &trade = '(' 'T' 'M' ')'
   &Auml = 0216
   &auml = 0204

Обратите внимание, что указанные в таблице преобразования соответствия для нестандартных символов HTML не используются HTML TADS, поскольку этот интерпретатор способен одновременно выводить символы нескольких кодовых страниц, переключаясь между кодировками по мере необходимости.

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

Системные вопросы: кодовые страницы и шрифты

Средства трансляции кодовых страниц в TADS полностью переносимы, поскольку TADS сам по себе никак не привязан к конкретной кодовой странице, используемой компьютером. Таким образом, выбирать ли способ трансляции, ориентируясь на кодовую страницу, использовавшуюся в момент написания игры, или на кодовую страницу, использующуюся при запуске игры игроком, зависит только от автора.

В некоторых операционных системах можно менять кодовую страницу в ходе работы. Например, DOS позволяет устанавливать кодовую страницу, используя команду CHCP.

Возможны ситуации, когда вам может потребоваться установить кодовую страницу для операционной системы и трансляционную таблицу для TADS.

Например, пусть игра запускается в среде DOS с кодовой страницей 437 (американский английский). В этой кодовой странице присутствует большинство символов страницы ISO Latin-1, однако с иными кодами. Тогда для запуска игры, использующей ISO Latin-1 в качестве внутренней кодовой страницы, вам потребуется указать трансляционную таблицу, устанавливающую соответствие между кодовыми страницами ISO Latin-1 и 437.

Пусть теперь вы хотите запустить игру, использующую внутреннюю кодовую страницу ISO Latin-2. В кодовой странице 437 для DOS многие символы из ISO Latin-2 отсутствуют, поэтому обеспечить удовлетворительную трансляцию этой пары кодовых страниц не удастся. Однако для DOS существует другая кодовая страница, 852, содержащая символы ISO Latin-2. Таким образом, чтобы запустить эту игру, вам потребуется поменять кодовую страницу на 852 (при помощи команды CHCP), а затем указать при запуске игры таблицу трансляции между ISO Latin-2 и 852. (Изменение кодовой страницы в DOS может потребовать дополнительных манипуляций; подробнее читайте в документации по DOS).

В отличие от интерпретатора для DOS, интерпертатор HTML TADS для Windows способен динамически выбрать кодовую страницу в ходе выполнения программы. Т. е. здесь используется принципиально другой метод подбора кодовой страницы - вместо того, чтобы искать нужную таблицу преобразования, HTML TADS просто проверяет файл таблицы трансляции внутренней кодовой страницы и на основании полученных данных подбирает нужную нативную кодовую страницу. Для того, чтобы этот функционал работал нормально, в файле таблицы трансляции должен быть указан атрибут EXTRA_SYSTEM_INFO, определяющий правильный номер кодовой страницы Windows (интерпретатором для DOS этот атрибут игнорируется).

Всякая вещь есть форма проявления беспредельного разнообразия.
КОЗЬМА ПРУТКОВ, Плоды раздумья (1884)


Приложение K Содержание