На этом шаге мы рассмотрим концепцию локального контекста.
Распространенный подход к интернационализации основан на использовании специальных сред, называемых локальными контекстами (locale) и инкапсулирующих национальные или культурные стандарты. Именно этот подход используется в языке С. Таким образом, в отношении интернационализации локальный контекст представляет собой набор параметров и функций, обеспечивающих поддержку национальных или культурных стандартов. В соответствии с конвенциями Х/Open (POSIX и Х/Open - стандартные спецификации интерфейсов операционных систем) локальный контекст используется переменной окружения с именем LANG. В зависимости от локального контекста выбираются разные форматы вещественных чисел, дат, денежных сумм и т. д.
Обычно локальный контекст определяется строкой в формате
язык[_зона[.код]]
Здесь язык - обозначение языка (например, английский или немецкий), а зона - страна, географический регион или культура, в которой используется этот язык. В частности, этот квалификатор позволяет поддерживать национальные стандарты даже в том случае, если на одном языке говорят в разных странах. Квалификатор код определяет кодировку символов. Он важен, прежде всего, для азиатских стран, где один набор символов может существовать в нескольких кодировках.
В таблице 1 приведена подборка типичных определений локальных контекстов. Однако следует помнить, что эти строки еще не стандартизированы (так, первый символ языка может записываться в верхнем регистре). Некоторые реализации отходят от представленного формата; например, английский локальный контекст в них обозначается строкой english. В конечном счете поддержка тех или иных локальных контекстов системой зависит от реализации.
Имя | Описание |
---|---|
С | Используется по умолчанию: соглашения стандарта ANSI-C (английский, 7-разрядная кодировка) |
de_DE | Немецкий язык (Германия) |
de_DE.88591 | Немецкий язык (Германия) с кодировкой ISO Latin-1 |
de_AT | Немецкий язык (Австрия) |
de_CH | Немецкий язык (Швейцария) |
en_US | Английский язык (США) |
en_GB | Английский язык (Великобритания) |
en_AU | Английский язык (Австралия) |
en_CA | Английский язык (Канада) |
fr_FR | Французский язык (Франция) |
fr_CH | Французский язык (Швейцария) |
fr_CA | Французский язык (Канада) |
ja_JP.jis | Японский язык (Япония) с кодировкой JIS (Japanese Industrial Standard) |
ja_JP.sjis | Японский ЯЗЫК (Япония) с кодировкой Shift IIS |
ja_JP.ujis | Японский язык (Япония) с кодировкой UNIXized JIS |
ja_JP.EUC | Японский язык (Япония) с кодировкой EUC (Extended Unix Code) |
ko_kr | Корейский язык (Корея) |
zh_CN | Китайский язык (Китай) |
zh_TW | Китайский язык (Тайвань) |
lt_LN.bit7 | ISO Latin (7-разрядная кодировка) |
lt_LN.bit8 | ISO Latin (8-разрядная кодировка) |
POSIX | Соглашения стандарта POSIX: английский, 7-разрядная кодировка |
Несмотря на обилие имен локальных контекстов, у программ обычно не возникает особых проблем с нестандартными именами! Дело в том, что информация локального контекста в той или иной форме предоставляется пользователем. Как правило, программа просто читает информацию из переменных окружения или базы данных и определяет, с какими локальными контекстами она должна работать. Таким образом, хлопоты с определением правильных имен контекстов возлагаются на пользователя. Только если программа всегда использует конкретный локальный контекст, имя этого контекста жестко кодируется в программе. Обычно в таких случаях достаточно локального контекста С, который заведомо поддерживается всеми реализациями под именем С.
В следующих шагах мы покажем, как работать с разными локальными контекстами в программе на C++. Кроме того, опишем фацеты локальных контекстов, позволяющие задействовать конкретные варианты форматирования.
В языке С предусмотрен также механизм применения кодировок, содержащих более 256 символов. Этот механизм основан на использовании символов wchar_t - синонима для одного из целочисленных типов с языковой поддержкой констант и строковых литералов в расширенной кодировке. В остальном же поддерживаются только функции преобразования между расширенной и обычной кодировками. Этот подход также был реализован в C++ с типом символов wchar_t, который является вполне самостоятельным типом (в отличие от языка С). По уровню библиотечной поддержки C++ превосходит С - практически все возможности типа char доступны для wchar_t (и любого другого типа, который может использоваться в качестве типа символов).
На следующем шаге мы рассмотрим использование локальных контекстов.