|
Программирование >> Операторы преобразования типа
Имя Описание fr CH Французский язык (Швейцария) fr CA Французский язык (Канада) Ja.JP.Jis Японский язык (Япония) с кодировкой JIS (Japanese Industrial Standard) ja ]P.sjls Японский язык (Япония) с кодировкой Shift JIS jaJP.ujis Японский язык (Япония) с кодировкой UNIXized JIS ja.JP.EUC Японский язык (Япония) с кодировкой EUC (Extended Unix Code) ko kr Корейский язык (Корея) zh CN Китайский язык (Китай) zhJTW Китайский язык (Тайвань) lt LN.bit7 ISO Latin (7-разрядная кодировка) It l-N.blt8 ISO Latin (в-разрядная кодировка) POSIX Соглашения стандарта POSIX: английский, 7-разрядная кодировка Несмотря на обилие имен локальных контекстов, у программ обычно не вознцг кает особых проблем с нестандартными именами! Дело в том, что информация локального контекста в той или иной форме предоставляется пользователем. Как правило, программа просто читает информацию из переменных окружения или базы данных и определяет, с какими локальными контекстами она должна работать. Таким образом, хлопоты с определением правильных имен контекстов возлагаются на пользователя. Только если программа всегда использует конкретный локальный контекст, имя этого контекста жестко кодируется в программе. Обычно в таких случаях достаточно локального контекста С, который заведомо поддерживается всеми реализациями под именем С. Далее показано, как работать с разными локальными контекстами в программе на С++. Кроме того, описываются фацеты локальных контекстов, позволяющие задействовать конкретные варианты форматирования. В языке С предусмотрен также механизм применения кодировок, содержащих более 256 символов. Этот механизм основан на использовании символов wchar t - синонима для одного из целочисленных типов с языковой поддержкой констант и строковых литералов в расширенной кодировке. В остальном же поддерживаются только функции преобразования между расширенной и обычной кодировками. Этот подход также был реализован в С++ с типом символов wchart, который является вполне самостоятельным типом (в отличие от языка С). По уровню библиотечной поддержки С++ превосходит С - практически все возможности типа char доступны для wchar t (и любого другого типа, который может использоваться в качестве типа символов). Использование локальных контекстов Полноценная интернационализация обычно не ограничивается преобразованием текстовых сообщений. Например,необходимо также позаботиться об использовании разных стандартов форматирования чисел, денежных величин и дат. Если некоторая функция работает с буквами, она должна на основании данных локального контекста обеспечить корректную обработку всех букв данного языка. Согласно стандартам POSIX и Х/Орен, локальный контекст может задаваться и в программах языка С. Для этой цели применяется функция setlocale(). Смена локального контекста влияет на работу функций, зависящих от классификации и преобразования символов (например, isupper() и toupperO), а также функций ввода-вывода (таких, как printf()). Однако подход, реализованный в С, ограничен. Поскольку локальный контекст является глобальным свойством, одновременное использование нескольких локальных контекстов (например, чтение вещественных чисел по английским стандартам и вывод их в немецком стандарте) либо невозможно, либо требует относительно больших усилий. Кроме того, локальные контексты С не расширяются. Они обладают только теми возможностями, которые заложены в них реализацией. Если потребуется реализовать какую-нибудь новую возможность, придется использовать другой механизм. Наконец, механизм С не позволяет определять новые локальные контексты для поддержки специальных культурных стандартов. Стандартная библиотека С++ решает все перечисленные проблемы при помощи объектно-ориентированного подхода. Прежде всего, строение локального контекста инкапсулируется в объекте типа locale, что позволяет использовать несколько локальных контекстов одновременно. Операции, зависящие от локальных контекстов, настраиваются на применение соответствующих объектов. Например, с каждым потоком данных для ввода-вывода можно ассоциировать объект локального контекста, который задействуется различными функциями потока данных для соблюдения соответствующих стандартов. В следующем примере показано, как это делается: il8n/locl.cpp #1nclude <1ostredm> #1nclude <locdle> using namespace std: int mainC) { /./ Использование классического локального контекста С для чтения данных из стандартного ввода cin. imbued оса!е: :cTassicO): Использование немецкого локального контекста для записи данных в стандартный вывод cout.imbued оса!еС de DE )): Чтение и запись вещественных чисел в цикле double value: while (cin value) { cout value endl; Показанная ниже команда ассоциирует классический локальный контекст С со стандартным каналом ввода: cin.imbuedocale::classic()); В этом локальном контексте форматирование дат и чисел, классификация символов и т. д. выполняются так же, как в исходном языке С без назначения локальных контекстов. Следующее выражение возвращает соответствующий объект класса locale: std::Toca1e::classic() Тот же результат будет получен при использовании выражения: std::locale( C ) Это выражение конструирует объект locale с заданным именем. Специальное имя С является единственным именем, которое заведомо поддерживается реализацией С++. Поддержка любых других локальных контекстов не гарантирована, хотя предполагается, что язык С++ поддерживает другие локальные контексты. Соответственно следующая команда ассоциирует локальный контекст de DE со стандартным каналом ввода: cout.i mbue С Т оса 1е( de DE )); Разумеется, команда выполняется успешно только в том случае, если этот локальный контекст поддерживается системой. Если при конструировании объекта локального контекста будет указано неизвестное имя, генерируется исключение runtime error. Если все прошло успешно, то входные данные читаются по классическим правилам С (например, 47.11), а выходные данные выводятся по немецким стандартам (47,11). В Германии, как и в России, для отделения дробной части от целой используется запятая. Как правило, программы не определяют свои локальные контексты, кроме случаев, когда чтение и запись данных производятся в фиксированном формате. Вместо этого локальный контекст определяется по значению переменной окружения LANG. Имя локального контекста также может вводиться из других источников, как показано в следующем примере: il8n/loc2.cpp #include <iostream> Iinclude <locale> #include <string> Iinclude <cstdlib> using namespace std; int mainC) Создание локального контекста no умолчанию 8 зависииости от состояния переменной окружения locale langLocaleC );
|
© 2006 - 2025 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |