Правда в том, что подробности на самом деле не нужны. Вам, как разработчику программ, не нужно беспокоиться о них; как заставить все работать, зависит от разработчиков библиотек. Все, что нужно, это понять концепции и использовать в своем коде соответствующие функции, такие, как strcoll()
(см. раздел 13.2.3 «Сравнение строк: strcoll()
и strxfrm()
»).
Современные системы GLIBC предоставляют отличную поддержку локалей, включая поддерживающие локали процедуры сопоставления регулярных выражений. Например, расширенное регулярное выражение POSIX [[:alpha:]][[:alnum:]]+
соответствует букве, за которой следуют одна или более букв или цифр (алфавитный символ, за которым следуют один или более алфавитно-цифровых символов). Определение того, какие символы соответствуют этим классам, зависит от локали. Например, это регулярное выражение соответствовало бы двум символам 'eè
', тогда как регулярное выражение [a-zA-Z][a-A-Zz0-9]+
традиционного, ориентированного на ASCII Unix — скорее всего нет. Классы символов POSIX перечислены в табл. 13.5.
Таблица 13.5. Классы символов регулярных выражений POSIX
Класс | Соответствует |
---|---|
[:alnum:] | Алфавитно-цифровые символы |
[:alpha:] | Алфавитные символы |
[:blank:] | Символы пробела и табуляции. |
[:cntrl:] | Управляющие символы |
[:digit:] | Цифровые символы |
[:graph:] | Символы, являющиеся одновременно печатными и видимыми. (Символ конца строки печатный, но не видимый, тогда как $ является и тем, и другим.) |
[:lower:] | Строчные алфавитные символы |
[:print:] | Печатные (не управляющие) символы |
[:punct:] | Знаки пунктуации (не буквы, цифры, управляющие или пробельные символы) |
[:space:] | Пробельные символы (такие, как сам пробел, символы табуляции, конца строки и т.д) |
[:upper:] | Заглавные алфавитные символы |
[:xdigit:] | Символы из набора abcdefABCDEF0123456789 |
Возможно, вам никогда не придется иметь дело с различными наборами символов и их представлениями. С другой стороны, мир быстро становится «глобальным сообществом», и авторы программ не могут позволить себе быть ограниченными. Следовательно, стоит знать о проблемах интернационализации и наборов символов, а также способах их влияния на поведение вашей системы. По крайней мере, уже один из поставщиков дистрибутивов GNU/Linux устанавливает для систем в Соединенных Штатах локаль по умолчанию en_US.UTF-8
.
1.
Мы уже упоминали эту книгу раньше. Она дает точное и исчерпывающее описание развития и использования возможностей стандартной библиотеки С для работы с многобайтными и широкими символами. Это особенно ценно для современных систем, поддерживающих C99, поскольку библиотека была значительно усовершенствована для стандарта С 1999 г.
2. gettext
. На системе GNU/Linux вы можете посмотреть локальную копию через 'info gettext
'. Или загрузить и распечатать последнюю версию (по адресу ftp://ftp.gnu.org/gnu/gettext/
).
• Интернационализация и локализация программ подпадают под общее название
• Использование локали устанавливается с помощью функции setlocale()
. Различные категории локали предоставляют доступ к различным видам информации локали. Не использующие локаль программы действуют, как если бы они находились в локали «С», которая выдает типичные для систем Unix до NLS результаты: 7-разрядный ASCII, английские названия месяцев и дней и т.д. Локаль «POSIX» эквивалентна локали «С».