BASH Programming - Введение


Настройка локали


Прежде всего -- подробная документация о локали имеется на

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

Документацию по иксовой локали можно найти по адресу

Вот инструкция для нетерпеливых (только для glibc).

Вам нужно:

  • Зайти в /usr/share/locale и создать там симлинк ru_RU.KOI8-R, указывающий на ru_SU.

    Эта операция необходима только для glibc < 2.1.2.

  • Как-либо прописать установку переменной LANG в стартовых скриптах. В RedHat-based дистрибутивах это делается путем редактирования файла /etc/sysconfig/i18n, где, кроме прочего, должна быть строчка

    LANG=ru_RU.KOI8-R

    В общем случае можно прописать в /etc/profile

    LANG=<ваша кодировка> export LANG

  • Проверить, что все работает, можно, запустив locale и посмотрев, что она выдает, а также набрав cal, date -- названия месяцев и дней недели должны быть по-русски.
  • Гораздо же честнее сделать отдельный настоящий каталог: /usr/share/locale/ru_RU.KOI8-R/ (конечно, если его нет в данном дистрибутиве).

    Некоторые дистрибутивы неправильно включают

    LANG=ru LC_ALL=ru_RU.KOI8-R

    Это НЕПРАВИЛЬНО, почему так делать нельзя -- описано ниже.

    А теперь поговорим о том же, но гораздо подробнее. Итак:

    Как включить локализацию?



    Если на UNIX машине (с POSIX:1996) средства locale правильно установлены и программы правильно написаны, то локализация включается путем задания строки окружения LANG:

    $ export LANG={язык}

    Если такой строки окружения нет, то работает значение локализации по умолчанию: LANG="C" или LANG="POSIX"

    (что то же самое) -- минимальный набор параметров, необходимый для функционирования программ на ANSI C (ISO 9899:1990), в кодировке US-ASCII (7 bit) ( ).

    Если ваша система имеет полный набор утилит POSIX.2, то узнать установленные в системе и допустимые значения для LANG= можно командой locale:

    $ locale -a

    По новому стандарту (POSIX.2 приложение E (?)) значения локализации записываются в форме:


    language_TERRITORY.Codeset

    или формально:

    language[_TERRITORY[.Codeset[@modifier]]]

    Стандарт ISO 639 описывает "language names", ISO 3166 -- "territory names". Территории _SU более не существует (вернее, теперь она означает Судан), однако для совместимости некоторые системы продолжают ее поддерживать как alias: ru_SU --> ru_RU.

    Для русского языка LANG устанавливается, как правило, равным LANG="ru_RU.KOI8-R" или LANG="ru_RU.ISO_8859-5". То есть:

    $ export LANG="ru_RU.KOI8-R"

    Согласно стандарту допустимы также короткие именования значений locale, которые часто оформляются как aliases (псевдонимы) полного наименования. Например "C" --> "POSIX".

    $ export LANG=ru $ export LANG=ru_RU $ export LANG=ru_RU.KOI8-R

    Однако, если вы указываете короткое имя, может оказаться, что ваша кодировка оказывается вовсе не KOI8-R (почему следует использовать именно koi8-r, описано в разделе ). Лучше не пользоваться значениями по умолчанию, а указывать точное длинное имя.

    Во FreeBSD 2.x так и есть. Для Linux -- зависит от дистрибутива. В коммерческих реализациях (Solaris, SCO, AIX etc) как правило используется значение LANG="ru_RU", или укороченное LANG="ru" (и как правило, Codeset ISO8859-5 по умолчанию).

    Некоторые могут пожелать сделать себе локализацию в другом наборе символов: ru_RU.X-CP-866 (ru_RU.IBM866), ru_RU.x-mac-cyrillic, ru_RU.ISO_8859-5 или даже ru_RU.CP1251 -- на это нет никаких ограничений. Все эти кодировки совершенно равноправны и зарегистрированы (кроме x-mac-cyrillic) в IANA. Только не забудьте, что локализация, ввод-вывод и отображение национальных символов на терминале -- это совершенно разные вещи.

    Если система локализована не полностью и использовать полное переключение на другой язык (с помощью export LANG={язык}) нельзя, можно включить locale только для функций locale API

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

    Если вас раздражают русские даты, сообщения и man-ы, но нужно обрабатывать русские буквы и т.д., то сделайте:



    $ export LANG="C" $ export LC_CTYPE="ru_RU.KOI8-R" $ export LC_COLLATE="ru_RU.KOI8-R" $ export LC_TIME="C"

    Не рекомендуется использовать строку окружения:

    $ export LC_ALL={язык}

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

    локализации ru_RU в соответствии со стандартом ГОСТ в качестве десятичного разделителя используется символ 'запятая': ","  в то время, как в стандарте языка PostScript -- точка "."  А категория LC_NUMERIC

    оказывает влияние на printf("%f",float);. Используйте значение C (POSIX) для LC_NUMERIC, если вы работаете с PostScript:

    $ export LC_NUMERIC="POSIX"

    Посмотреть текущие значения категорий локализации можно все той же утилитой locale (без параметров).

    $ locale

    ПРИМЕЧАНИЕ: В некоторых современных системах начинает появляться локализация в UNICODE. Включается она заданием строки окружения LANG="ru_RU.UTF-8"  для России.


    Содержание раздела