Функция
setlocale()
используется для установления или определения текущей локали программы.
Если
locale
не равно
NULL,
то текущяя локаль программы изменяется в соответствии с аргументами.
Аргумент
category
определяет, какая часть текущей локали программы подлежит изменению.
LC_ALL
используется для всей локали.
LC_COLLATE
- для соотнесения регулярных выражений (определяет значение
интервалов и классов эквивалентности) и сопоставления строк.
LC_CTYPE
- для соотнесения регулярных выражений, классификации символов, преобразований,
сравнения (с учетом регистра) и работы функций широких символов.
LC_MESSAGES
- для сообщений, подлежащих локализации.
LC_MONETARY
- для форматирования денежных единиц.
LC_NUMERIC
- для форматирования чисел (используется десятичный разделитель,
разделители тысяч и т.п.).
LC_TIME
- для форматирования календаря и дат.
Аргумент
locale
является указателем на строку символов, содержащую установки, требуемые
category.
Эта строка является либо широко известной константой "C" (или "da_DK")
(см. ниже), либо строкой, возвращаемой вызовом
setlocale.
Если
locale
равна
,
то каждая часть локали подлежит изменению в соответствии
с переменными окружения. Все детали зависят от реализации.
В случае с glibc сначала
(независимо от
category)
проверяется переменная окружения LC_ALL,
затем переменная окружения с таким же названием, что и категория
(LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC, LC_TIME),
и в конце проверяется переменная окружения LANG.
Используется первая существующая переменная окружения.
Если ее значение не является правильным для локали, то локаль не изменяется, а
setlocale
возвращает NULL.
Локали
C
и
POSIX
являются совместимыми с другими локалями;
код части LC_CTYPE соответствует 7-битному коду набора символов ASCII.
Название локали обычно имеет форму
language[_territory][.codeset][@modifier],
где
language
является кодом языка в соответствии ISO 639,
territory
является кодом страны, согласно ISO 3166, а
codeset
является набором символов или видом кодировки, как, например,
ISO-8859-1
или
UTF-8.
Для вывода списка всех поддерживаемых локалей, попробуйте "locale -a".
См.
locale(1).
Если значение
locale
равно
NULL,
то запрашиваются параметры текущей локали, но при этом она не изменяется.
При запуске программы локаль
C
устанавливается по умолчанию.
Программа может быть сделана совместимой со всеми типами локалей вызовом
setlocale(LC_ALL, )
после инициализации программы, при использовании значений, возвращенных
от вызова
localeconv()
для локалезависимой информации, при использовании многобайтовых функций
и функций для работы с широкими символами для обработки текстов, если
MB_CUR_MAX > 1;
а также при использовании
strcoll(), wcscoll()
или
strxfrm(), wcsxfrm()
для сравнения строк.
ВОЗВРАЩАЕМЫЕ ЗНАЧЕНИЯ
Успешный вызов
setlocale()
возвращает строку, соответствующую текущим установкам локали. Эта строка
может быть статически распределена. Возвращенная строка будет такой, что
повторный вызов с этой строкой и ассоциированной с ней категорией
восстановит часть локали, измененной процессом. Возвращаемое значение
будет равно
NULL,
если запрос не выполнен.
СООТВЕТСТВИЕ СТАНДАРТАМ
ANSI C, POSIX.1
ЗАМЕЧАНИЯ
Linux (that is, GNU libc) поддерживает совместимые локали
C и POSIX.
В старые добрые времена существовала поддержка локали European Latin-1
ISO-8859-1
(например, в libc-4.5.21 и libc-4.6.27) и русской локали
KOI-8
(точнее, "koi-8r", например, в libc-4.6.27),
поэтому, если переменная окружения LC_CTYPE была равна ISO-8859-1, было
достаточно написать isprint() для возврата правильного ответа. Сейчас
европейцам, не говорящим на английском, работать немного труднее, к тому
же им необходимо устанавливать первоначальные файлы локали.