Вопрос

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

Это было полезно?

Решение

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

Обычно включаются 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).

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

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

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

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

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

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

Ссылки:

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top