Что такое многобайтовый набор символов? - PullRequest
32 голосов
/ 14 апреля 2009

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

Ответы [ 9 ]

30 голосов
/ 14 апреля 2009

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

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

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

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

16 голосов
/ 14 апреля 2009

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

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

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

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

Действительно, в некоторых случаях «mbcs» - это не более чем синоним системной кодовой страницы, иначе известный (даже более вводящий в заблуждение) как «ANSI». В этом случае «многобайтовый» набор символов может фактически быть чем-то таким же тривиальным, как западноевропейский cp1252, который использует только один байт на символ!

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

6 голосов
/ 14 апреля 2009

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

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

4 голосов
/ 14 апреля 2009

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

Ссылки:

2 голосов
/ 14 апреля 2009

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

2 голосов
/ 14 апреля 2009

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

2 голосов
/ 14 апреля 2009

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

1 голос
/ 18 сентября 2018

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

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

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

1 голос
/ 31 декабря 2016

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

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

...