Главная » Delphi » Unicode

0

Введение двухбайтной кодировки было задумано хорошо, а выполнено (по крайней мере, в Windows)— "как всегда". Читаем в официальном пособии [1, стр. 519]: "Архитектура .шогоязыковой поддержки базируется на раскладках клавиатуры". Привязка переключения раскладки к переключению языка была, конечно, ошибкой: на практике следовало эти функции жестко и безоговорочно разделить. А зачем, однако, разработчикам Windows вообще понадобилось отдельно понятие "языка", если он при отображении на экране однозначно определяется текущей кодовой страницей, а при вводе — текущей раскладкой клавиатуры? Все дело в том, что через это разработчики Microsoft еще со времен Windows 3.x пытались обеспечить поддержку многоязычных документов и, надо сказать, сначала немало в том преуспели.

Вернемся к Shift-переключателям и попробуем воспроизвести логику работы Word 6.0 с его однобайтными шрифтами при отображении многоязычных документов. Напомним, что есть две задачи: при вводе надо правильно скомбинировать раскладку клавиатуры и текущую кодовую страницу, что в совокупности разумно объединить под неким понятием "язык" (как и было сделано в локализованных версиях Windows 3jc). А при отображении уже написанного текста раскладка клавиатуры в принципе не участвует: можно пометить разноязыкие участки текста некими "тегами", и тогда независимо от раскладки документ воспроизведется правильно. Понятие языка в том же смысле, как и ранее, здесь вообще не требуется — установленный "тег", как и в HTML, означает всего лишь шрифт нужного начертания, или, если хотите, нужной кодовой страницы (как мы видели в главе б, понятия текущей кодовой страницы и текущего экранного шрифта в принципе равнозначны). Именно поэтому вплоть до Windows 98 существовал отдельно Arial, Arial СЕ и Arial Суг. Но понятие "языка", объединяющего раскладку и экранный шрифт (кодовую страницу), тут еще не мешает: можно переключить шрифт с помощью соответствующего "тега", можно — отдельно раскладку соответствующей командой, а можно "язык", т. е. и то и другое. Но суть дела в том, что при переходе от однобайтных шрифтов к этих ухищрений уже вообще не требуется!

В все организовано элементарно просто и логично: если первый байт равен нулю, то второй соответствует начертанию символа из таблицы ASCII (или, что то же самое, английскому языку). Если же, к примеру, первый байт равен 4, то это кириллица. Русские буквы в таблице располагаются подряд, начиная со значения младшего байта, равного 16, "Ё" и "е", как всегда, отдельно (см. приложение 3). Всякие фигурные кавычки и прочие длинные тире выбираются из отдельных таблиц со своим значением первого байта. В принципе, если вы имеете некий -шрифт со всеми мыслимыми начертаниями знаков, то можете писать многоязычный текст на всех языках вперемешку. Правда, такой шрифт известен пока только один: это Arial MS, который имеет объем более 13 Мбайт, и оттого может еще и заработать не на всяком компьютере. Но на практике выше головы хватает и десятка заполненных национальных страниц— что и наблюдается в ходовых TTF-шрифтах.

Источник: Ревнч Ю. В.  Нестандартные приемы программирования на Delphi. — СПб.: БХВ-Петербург, 2005. — 560 е.: ил.

По теме:

  • Комментарии