Супчик из алфавита

До недавнего времени основными языками, которые люди использовали при общении с операционной системой Linux, были С, sh и Perl. Это операционка была просто недорогой, гибкой и удобной платформой для разработки и реализации различных сетевых сервисов. Разумеется, многие также использовали Linux для создания и редактирования текстовых документов, написанных на родном языке пользователя, но сфера подобного применения была очень узкой.

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

Этот процесс адаптирования системы к новой культуре называется локализацией. Он требует обеспечения поддержки определенной кодировки символов, наличия экранных шрифтов и возможности ввода и отображения текста на родном языке пользователя. Локализация также затрагивает настройку определенных стандартов, например, систему отсчета времени (12- или 24-часовая) и календарь (цифровой формат даты MM/DD/YY, как в США, или YY/MM/DD для международного стандарта, или DD/MM/YY???), символ национальной денежной единицы и порядок сортировки слов. Да, локализация - это не просто поддержка языка. Американцы и англичане говорят на одном языке, но символы национальной валюты и формат отображения даты/времени у них различаются.

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

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

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

Кернел Linux

Основой операционной системы является ее ядро - кернел. Основным условием является то, что он воспринимает текст на любом языке в цифровом виде. Данные, передаваемые от одного процесса другому, не должны подвергаться изменениям. Исторически компьютеры при передаче текстовых данных используют 7-битный формат ASCII. Часто коммуникационные программы используют старший бит в качестве "бита паритета" для контроля ошибок при передаче данных. Некоторые драйверы терминалов используют этот бит для реализации некоторых видеоэффектов (подчеркивание, мигание, реверс цвета фона...). К сожалению, семибитный формат передачи данных широко распространен и используется различными программами, например программами работы с электронной почтой, он зафиксирован даже в некоторых стандартах, например RFC-821 (для Simple Mail Transfer Protocol - SMTP) или RFC-822, который описывает формат заголовков текстовых сообщений, передаваемых по сети Интернет. Программное обеспечение, которое не накладывает таких ограничений на передаваемую информацию и не трансформирует ее, называется "8-bit clean".

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

Файловая система

Следующим уровнем является файловая система, которая обычно рассматривается как часть кернела. В случае с Linux, файловая система /proc просто неотделима от кернела. Пользователь активно взаимодействует с файловой системой - он может контролировать и изменять ее, присваивая файлам имена по своему усмотрению. Программе, которая обеспечивает взаимодействие пользователя с файловой системой, уже недостаточно быть "просто восьмибитной", так как символ-разделитель каталогов, /, имеет особое значение для операционной системы. А если учесть, что, например, в японском языке каждый символ кодируется двумя байтами, согласно стандарту JIS-X-0208, и второй байт может принять значение 0x2F (как раз тот самый символ "слэш")? Если файловая система воспринимает путь к файлам просто как последовательность символов, то эти данные будут восприниматься некорректно.

Основные стандарты для языков программирования, операционных систем (POSIX), пользовательского интерфейса (Х) и межмашинного обмена данными (RFC 1123, MIME и ISO2022) описывают отдельные наборы символов (charset), которые являются составными частями ASCII. Исключение составляет только ISO2022, который не использует по умолчанию ни ASCII, ни какой-либо другой набор символов, хотя и в нем присутствует влияние ASCII - 256 бит разделены на "левую" (восьмой бит равен 0) и "правую" (восьмой бит равен 1) половины размером по 128 символов, и в каждой из них начальные 32 позиции (с 0х00 по 0х1F) зарезервированы для управляющих символов, а остальные 96 - для отображаемых. Значения 0х20 и 0х7F зарезервированы за символами "Пробел" и "Забой" соответственно и не могут использоваться для отображения графических символов, хотя коды 0хА0 и 0хFF часто остаются неиспользованными.

Пользовательский интерфейс

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

Приложения

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

Сетевое взаимодействие

Самым верхним уровнем является уровень обмена данными между компьютерами. Он объединяет все проблемы, свойственные другим уровням, плюс имеет одну собственную. Внутри одной системы можно настроить и заставить работать все так, как это нужно, обеспечить поддержку любого языка, и на каждом уровне этим будет заниматься соответствующая подсистема. При общении с другой системой необходим механизм описания форматов данных. На внешнем уровне это MIME (Multipurpose Internet Multimedia Extensions), либо может использоваться протокол HTTP.

Компоненты локализации

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

Основное свойство - это отображение текста, для которого необходимы три составные части: набор символов, способ их кодировки и сам шрифт. Из набора символов отдельного языка формируются слова, фразы и предложения. Символ - это семантическая единица языка, понятие довольно-таки абстрактное. Компьютеры не могут оперировать непосредственно символами, эти символы должны быть закодированы в виде битовых последовательностей. Эти последовательности обычно имеют размер, равный восьми битам, которые, в соответствии со стандартом, принято называть не байтом, а октетом. Слово "байт" не используется, так как это машинно-ориентированная концепция, а "октет" может относиться к объекту, передаваемому по последовательной линии связи. Каждый символ имеет свой шестнадцатеричный код, например, "большой латинской букве А" соответствует код 0х41.

У человека нет последовательного порта для приема цифровых кодов, для ввода информации он предпочитает использовать зрение. Шрифт - это индексированный набор (не обязательно массив, так как в нем могут быть пустоты) глифов (glyphs) - графических изображений символов, которые могут отображаться на видео-мониторе или печататься на принтере. Каждый отдельно взятый глиф шрифта не обязательно строго соответствует определенному символу, например, в шрифте PostScript Times-Roman последовательность из двух символов "fi" представлена одним глифом с кодом 0хАЕ. И наоборот, некоторые буквы испанского, немецкого или французского языков, имеющие в своем начертании надстрочные знаки (например, "тильда" - с), могут быть составлены из двух глифов.

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

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

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

Случай с идеографическими восточными языками еще сложнее. Можно, конечно же, запомнить коды всех символов и печатать текст, вводя шестнадцатеричные числовые значения. Еще эффективнее было бы связать в памяти с каждым символом его двух-октетный эквивалент, состоящий из двух символов ASCII. Но сколько времени нужно потратить на запоминание хотя бы самых часто употребимых символов, если взрослый образованный японец знает порядка 10000 символов, а набор Unicode содержит их аж 20902! Для этих языков самый популярный метод - это ввод фонетических транскрипций.

Локали

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

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

- LANG - глобальная локаль, но может быть изменена в зависимости о значения остальных переменных, приведенных ниже;

- LC_COLLATE - отвечает за сортировку и сравнение;

- LC_TYPE - определяет набор символов;

- LC_MONETARY - информация о символе национальной валюты;

- LC_NUMERIC - информация о формате чисел: числовые группы, десятичный разделитель;

- LC_TIME - определяет формат времени, например 12-ти (AM/FM) или 24-часовой;

- LC_MESSAGES - определяет язык вывода текстовых сообщений программ;

- LC_ALL - устанавливает значение глобальной локали и может изменять все предыдущие переменные.

Примеры значений для глобальной локали:

- en_US - английский язык для США.

- it_IT - итальянский язык для Италии.

- fr_CA - французский язык для Канады.

- ru_SU - русский язык для СССР:)))

За основу берется стандарт для языка - LL и страны - CC, в результате получается общий формат локали LL_CC.

Локаль, используемая по умолчанию, называется С (или POSIX) локалью. Легко проиллюстрировать поведение программ при изменении значений локалей на примере простой команды date.

$echo $LC_ALL

$date

Tue Apr 27 17:21:49 EEST 1999

$cat /foo/bar

cat: /foo/bar: No such file or directory

$export LC_ALL="ru_SU"

$date

Втр Апр 27 17:22:34 EEST 1999

$cat /foo/bar

cat: /foo/bar: No such file or directory

$export LC_ALL="it_IT"

$date

mar apr 27 17:25:38 EEST 1999

$cat /foo/bar

cat: /foo/bar: No such file or directory

$export LC_ALL="fr_CA"

$date

mar avr 27 17:26:22 EEST 1999

$cat /foo/bar

cat: /foo/bar: Aucun fichier ou rйpertoire de ce type.

$export LC_ALL="en_CA"

$date

Tue Apr 27 17:26:47 EEST 1999

$cat /foo/bar

cat: /foo/bar: No such file or directory

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

Пакет Easy Cyrillic

Это очень легкий в установке и конфигурации пакет поддержки кириллицы для LINUX консоли, разработанный Сергеем Сторожевых и Вартаном Хачатуровым - easy-cyrillic-1.0.1.tar.gz. Сейчас доступна уже вторая версия. Программа легка в установке, поддерживает кодировки KOI8, CP1251 и CP866, а также языки, определенные пользователем, и сопровождается отличной документацией.

Игорь Грень


Компьютерная газета. Статья была опубликована в номере 19 за 1999 год в рубрике soft :: unix

©1997-2024 Компьютерная газета