Шаг 527.
Библиотека STL. Интернационализация. Различия в кодировках символов. Расширенные и многобайтовые кодировки

    На этом шаге мы перечислим различные кодировки.

    Одна из проблем, решаемых средствами интернационализации - поддержка разных кодировок символов. Эта проблема характерна в основном для Азии, где для представления символов используются разные кодировки. Как правило, в таких кодировках для кодирования каждого символа приходится задействовать более 8 бит, поэтому обработка текста требует новых концепций и функций.

Расширенные и многобайтовые кодировки

    Существуют два основных принципа определения кодировок, содержащих более 256 символов: многобайтовое и расширенное представления.

    Многобайтовое представление более компактно по сравнению с расширенным, поэтому для хранения данных вне программ обычно применяется многобайтовое представление. И наоборот, с символами фиксированного размера гораздо удобнее работать, поэтому в программах обычно используется расширенное представление.

    В ISO C++, как и в ISO С, используется тип wchar_t для расширенных кодировок. С другой стороны, в C++ wchar_t является ключевым словом, а не определением типа, что позволяет перегружать все функции с этим типом.

    В многобайтовой строке один и тот же байт может представлять целый символ или его часть. В процессе перебора содержимого многобайтовой строки каждый байт интерпретируется согласно текущему "состоянию сдвига". В зависимости от значения байта и текущего состояния сдвига байт может представлять символ или изменение состояния сдвига. Многобайтовая строка всегда начинается с определенного исходного состояния сдвига. Например, в исходном состоянии байты могут представлять символы ISO Latin-1 до тех пор, пока не будет обнаружен специальный символ перехода. Символ, следующий за ним, определяет новое состояние сдвига. Допустим, в новом состоянии сдвига байты могут интерпретироваться как арабские символы до тех пор, пока не будет обнаружен следующий символ перехода.

    Преобразование между кодировками символов осуществляется при помощи шаблона codecvt<>. Этот класс используется в основном классом basic_filebuf<> (смотри 493 шаг) для преобразования между внутренними и внешними представлениями. В стандарте C++ многобайтовые кодировки символов не оговариваются, но в нем предусмотрена запись состояния сдвига. У функций класса codecvt<> имеется аргумент, в котором может храниться произвольное состояние строки. Кроме того, класс поддерживает функцию для определения последовательности символов, используемой для возврата к исходному состоянию сдвига.

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




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