На этом шаге мы перечислим различные кодировки.
Одна из проблем, решаемых средствами интернационализации - поддержка разных кодировок символов. Эта проблема характерна в основном для Азии, где для представления символов используются разные кодировки. Как правило, в таких кодировках для кодирования каждого символа приходится задействовать более 8 бит, поэтому обработка текста требует новых концепций и функций.
Существуют два основных принципа определения кодировок, содержащих более 256 символов: многобайтовое и расширенное представления.
Многобайтовое представление более компактно по сравнению с расширенным, поэтому для хранения данных вне программ обычно применяется многобайтовое представление. И наоборот, с символами фиксированного размера гораздо удобнее работать, поэтому в программах обычно используется расширенное представление.
В ISO C++, как и в ISO С, используется тип wchar_t для расширенных кодировок. С другой стороны, в C++ wchar_t является ключевым словом, а не определением типа, что позволяет перегружать все функции с этим типом.
В многобайтовой строке один и тот же байт может представлять целый символ или его часть. В процессе перебора содержимого многобайтовой строки каждый байт интерпретируется согласно текущему "состоянию сдвига". В зависимости от значения байта и текущего состояния сдвига байт может представлять символ или изменение состояния сдвига. Многобайтовая строка всегда начинается с определенного исходного состояния сдвига. Например, в исходном состоянии байты могут представлять символы ISO Latin-1 до тех пор, пока не будет обнаружен специальный символ перехода. Символ, следующий за ним, определяет новое состояние сдвига. Допустим, в новом состоянии сдвига байты могут интерпретироваться как арабские символы до тех пор, пока не будет обнаружен следующий символ перехода.
Преобразование между кодировками символов осуществляется при помощи шаблона codecvt<>. Этот класс используется в основном классом basic_filebuf<> (смотри 493 шаг) для преобразования между внутренними и внешними представлениями. В стандарте C++ многобайтовые кодировки символов не оговариваются, но в нем предусмотрена запись состояния сдвига. У функций класса codecvt<> имеется аргумент, в котором может храниться произвольное состояние строки. Кроме того, класс поддерживает функцию для определения последовательности символов, используемой для возврата к исходному состоянию сдвига.
На следующем шаге мы рассмотрим трактовки символов.