Шаг 530.
Библиотека STL.
Интернационализация. Концепция локального контекста

    На этом шаге мы рассмотрим концепцию локального контекста.

    Распространенный подход к интернационализации основан на использовании специальных сред, называемых локальными контекстами (locale) и инкапсулирующих национальные или культурные стандарты. Именно этот подход используется в языке С. Таким образом, в отношении интернационализации локальный контекст представляет собой набор параметров и функций, обеспечивающих поддержку национальных или культурных стандартов. В соответствии с конвенциями Х/Open (POSIX и Х/Open - стандартные спецификации интерфейсов операционных систем) локальный контекст используется переменной окружения с именем LANG. В зависимости от локального контекста выбираются разные форматы вещественных чисел, дат, денежных сумм и т. д.

    Обычно локальный контекст определяется строкой в формате

язык[_зона[.код]]

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

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

Таблица 1. Примеры имен локальных контекстов
Имя Описание
С Используется по умолчанию: соглашения стандарта 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 (и любого другого типа, который может использоваться в качестве типа символов).

    На следующем шаге мы рассмотрим использование локальных контекстов.




Предыдущий шаг Содержание Следующий шаг