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

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

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

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

  • В многобайтовых кодировках символы представляются переменным количеством байтов. За однобайтовым символом
    (например, символом из кодировки ISO Latin-1) может следовать трехбайтовый символ (японский иероглиф).
  • В расширенных кодировках символ всегда представляется постоянным количеством байтов независимо от его типа. В типичных
    кодировках символ представляется величиной 2 или 4 байта. На концептуальном уровне такие кодировки не отличаются от представлений, в которых
    для локальных контекстов, где достаточно кодировки ISO Latin-1 или даже ASCII, используется однобайтовая кодировка.

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

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

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

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

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



Вы можете оставить комментарий, или Трекбэк с вашего сайта.

Оставить комментарий