Locale зависимое программирование
С locale программа не должна знать о различных символьных преобразованиях и правилах сравнения, описанных выше. Вместо этого они используют специальный API, который действует по правилам, определенным locale. Кроме того, нет необходимости для программы пользоваться только одной locale для соблюдения всех правил -- возможно пользоваться другими правилами, описанных в других locale (хотя такой метод не очень хорош).
Из man setlocale(3):
Программа может быть сделана переносимой для всех locale, вызывая setlocale(LC_ALL, "" ) после инициализации программы, используя значения, возвращенные из запроса localeconv() для locale-зависимой информации, и используя strcoll() или strxfrm() для сравнения строк.
Довольно легко определить четыре уровня программной локализации:
Очень важно, чтобы программа не делала каких-либо предположений относительно характера набора символов и их упорядочения. То есть следует воздержаться от следующих конструкций при программировании:
if (c >= 'A' && c <= 'Z') { ...
Подобные конструкции с точки зрения правильного "locale"-программирования совершенно недопустимы. Взамен во всех таких случаях должны использоваться, макрокоманды из locale зависимого файла заголовка ctype.h. Например:
if (isalpha(c) && isupper(c)) { ... или if (isascii(c) && isupper(c))
Хорошо написанная программа должна быть полностью 8-бит прозрачна. Например, отметка удаленного файла в MS-DOS кодом 0x0E5 -- не очень хорошее решение. Еще примеры плохих решений: знаменитая русская буква "Н" в редакторе GoldEd или русская буква "р" в Norton Commander...
(X/Open стандарт). Подробнее см. раздел
.
Для выяснения подробностей смотрите, например, (
) или (
).