Что такое многобайтовый набор символов?

термин многобайтовый относится к кодировке, символы которой могут - но не должны быть-шире 1 байта (например, UTF-8) или относятся к наборам символов, которые в любом случае шире 1 байта (например, UTF-16) ? Другими словами: что подразумевается, если кто-то говорит о многобайтовых наборах символов?

9 ответов


термин неоднозначен, но в моей работе по интернационализации мы обычно избегали термина "многобайтовые наборы символов" для обозначения кодировок на основе Юникода. Как правило, мы использовали этот термин только для устаревших схем кодирования, которые имели один или несколько байтов для определения каждого символа (исключая кодировки, требующие только одного байта на символ).

Shift-jis, jis, euc-jp, euc-kr, наряду с китайскими кодировками, как правило, включены.

большинство устаревших кодировок, с для некоторых исключений требуется своего рода модель машины состояний (или, проще говоря, модель подкачки страниц) для обработки, а перемещение назад в текстовом потоке является сложным и подверженным ошибкам. UTF-8 и UTF-16 не страдают от этой проблемы, так как UTF-8 можно протестировать с помощью битовой маски, а UTF-16 можно протестировать против ряда суррогатных пар, поэтому перемещение назад и вперед в непатологическом документе можно безопасно сделать без большой сложности.

несколько устаревших кодировок для таких языков, как тайский и вьетнамцы, имеют некоторую сложность многобайтовых наборов символов, но на самом деле просто построены на объединении символов и обычно не объединяются с широким термином "многобайтовые"."


что означает, если кто-нибудь говорит о многобайтовых наборах символов?

Это, как обычно, зависит от того, кто говорит!

логически он должен включать UTF-8, Shift-JIS, GB и т. д.: кодировки переменной длины. UTF-16 часто не рассматривался бы в этой группе (хотя это своего рода, что с суррогатами; и, конечно, это несколько байтов при кодировании в байты через UTF-16LE/UTF-16BE).

но в Microsoftland термин обычно используется для обозначения системной кодовой страницы переменной длины по умолчанию (для устаревших приложений, не связанных с Unicode, которых, к сожалению, все еще много). В этом использовании UTF-8 и UTF-16LE/UTF-16BE не могут быть включены, поскольку системная кодовая страница в Windows не может быть установлена ни в одну из этих кодировок.

действительно, в некоторых случаях " mbcs "является не более чем синонимом системной кодовой страницы, иначе известной (еще более ошибочно) как"ANSI". В этом случае набор символов "multibyte" на самом деле может быть что-то тривиальное, как cp1252 Western European, который использует только один байт на символ!

мой совет: используйте "переменную длину", когда вы имеете в виду это, и избегайте двусмысленного термина" многобайтовый"; когда кто-то другой использует его, вам нужно будет попросить разъяснений, но обычно кто-то с фоном Windows будет говорить о устаревшей кодовой странице Восточной Азии, такой как cp932 (Shift-JIS), а не UTF.


все наборы символов, где у вас нет сопоставления символов 1 байт = 1. Все варианты Unicode, но и азиатские наборы символов многобайтовые.

для получения дополнительной информации, я предлагаю чтение эта статья в Википедии.


многобайтовый символ будет означать символ, кодировка которого требует более 1 байта. Однако это не означает, что все символы, использующие эту конкретную кодировку, будут иметь одинаковую ширину (в байтах). Например: кодированный символ UTF-8 и UTF-16 может иногда использовать несколько байтов, тогда как все UTF-32 закодированные символы всегда используйте 32 бита.

ссылки:


обычно первый, т. е. UTF-8-подобный. Для получения дополнительной информации см. кодировка переменной ширины.


первый-хотя термин "кодировка переменной длины" был бы более подходящим.


Я обычно использую его для обозначения любого символа, который can имеют более одного байта на символ.


многобайтовый набор символов может состоять как из одного, так и из двух байтов письмена. Таким образом, многобайтовая символьная строка может содержать смесь однобайтовые и двухбайтовые символы.

Ref:однобайтовые и многобайтовые наборы символов


UTF-8 является многобайтовым, что означает, что каждый английский символ (ASCII) хранится в 1 байте, а не английский символ, такой как китайский, тайский, хранится в 3 байтах. Когда вы смешиваете китайский / тайский с английским, как "ทt", первый тайский символ" ท "использует 3 байта, а второй английский символ" t " использует только 1 байт. Люди, которые разработали многобайтовое кодирование, поняли, что английский символ не должен храниться в 3 байтах, пока он может поместиться в 1 байт из-за отходов хранения пространство.

UTF-16 хранит каждый символ на английском или неанглийском языке с фиксированной длиной 2 байта, поэтому он не является многобайтовым, а называется широким символом. Он очень подходит для китайских / тайских языков, где каждый символ полностью вписывается в 2 байта, но для печати на вывод консоли utf-8 требуется преобразование из широкого символа в многобайтовый формат с помощью функции wcstombs().

UTF-32 хранит каждый символ в фиксированной длине 4 байта, но никто не использует его для хранения символа из-за отходы складских помещений.