На этом шаге мы рассмотрим общие вопросы, связанные с интернационализацией.
С развитием глобального рынка интернационализация стала играть более важную роль в разработке программного обеспечения. По этой причине в стандартную библиотеку C++ были включены средства написания локализованного кода. В основном они связаны с вводом-выводом и обработкой строк. Этим средствам и посвящены следующие шаги.
Стандартная библиотека C++ предоставляет общие средства поддержки национальных стандартов без привязки к конкретным системам и правилам. Например, строки не ограничиваются конкретным типом символов, чтобы обеспечить поддержку 16-разрядных азиатских кодировок символов. При интернационализации программ должны учитываться следующие обстоятельства.
В обоих случаях стандартная библиотека C++ предоставляет соответствующие средства.
Основной механизм интернационализации основан на использовании объекта локальною контекста. Локальный контекст (locale) отражает расширяемый набор правил, адаптируемых для конкретных национальных стандартов. Локальные контексты уже применялись в языке С. В стандарте C++ этот механизм был обобщен и стал более гибким. Механизм локальных контекстов C++ может использоваться для выполнения любых настроек в зависимости от рабочей среды или предпочтений пользователя. Например, его можно расширить так, чтобы он учитывал единицы измерения, часовые пояса, стандартный размер бумаги и т. д.
Многие механизмы интернационализации практически не требуют дополнительной работы со стороны программиста. Например, в потоковом механизме ввода-вывода C++ числовые данные форматируются по правилам локального контекста. Программисту остается лишь позаботиться о том, чтобы классы потоков данных для ввода-вывода учитывали предпочтения пользователя.
Наряду с автоматическим использованием программист может напрямую обращаться к объектам локального контекста для форматирования, классификации символов и т. д. Некоторые средства интернационализации, поддерживаемые стандартной библиотекой C++, не требуются самой библиотеке - программисты должны вызывать эти функции в своих программах. Например, в стандартной библиотеке C++ не определены потоковые функции для форматирования времени, даты или денежных величин. Чтобы выполнить такое форматирование, необходимо вызвать соответствующую функцию (например, из пользовательского потокового оператора для вывода объектов денежных величин).
Интернационализация строк и потоков данных основана на концепции трактовок символов. Трактовки определяют базовые свойства и операции, зависящие от кодировки (такие, как признак "конца файла" или функции сравнения, присваивания и копирования строк).
Классы интернационализации были включены в стандарт относительно поздно. Хотя общий механизм чрезвычайно гибок, он нуждается в некоторой доработке. Например, функции контекстного сравнения строк (то есть сравнения строк с учетом правил локального контекста) используют только итераторы типа const charT*, где charT* - некоторый тип символов. Хотя с очень большой вероятностью в классе basic_string<charT> задействуется именно этот тип итератора, это вовсе не гарантировано. Следовательно, не гарантировано и то, что строковые итераторы могут передаваться в аргументах функций контекстного сравнения строк. С другой стороны, результат вызова функции data() класса basic_string может передаваться функциям контекстного сравнения.
Со следующего шага мы начнем рассматривать различия в кодировках символов.