Что такое многобайтовый набор символов?
Относится ли термин многобайтовый к кодировке, чьи символы могут - но не обязательно должны быть - шире, чем 1 байт (например, UTF-8), или он относится к наборам символов, которые в любом случае шире, чем 1 байт (например, UTF)? -16) Другими словами: что подразумевается, если кто-то говорит о многобайтовых наборах символов?
9 ответов
Этот термин неоднозначен, но в моей работе по интернационализации мы обычно избегали использования термина "многобайтовые наборы символов" для обозначения кодировок на основе 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).
Но в Microsoftland этот термин более обычно используется для обозначения системной кодовой страницы по умолчанию с переменной длиной (для устаревших приложений, не поддерживающих Юникод, которых, к сожалению, еще много). При таком использовании 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 является многобайтовым, что означает, что каждый английский символ (ASCII) хранится в 1 байте, а неанглийские символы, такие как китайский и тайский, хранятся в 3 байтах. Когда вы смешиваете китайский / тайский с английским, например, "ทt", первый тайский символ "ท" использует 3 байта, а второй английский символ "t" использует только 1 байт. Люди, которые разработали многобайтовое кодирование, поняли, что английский символ не должен храниться в 3 байтах, в то время как он может уместиться в 1 байте из-за потери места для хранения.
UTF-16 хранит каждый символ на английском или неанглийском языке с фиксированной длиной 2 байта, поэтому он не является многобайтовым, а называется широким символом. Это очень подходит для китайского / тайского языков, где каждый символ умещается полностью в 2 байта, но для вывода на консольный вывод utf-8 требуется преобразование широкого символа в многобайтовый формат с помощью функции wcstombs ().
UTF-32 хранит каждый символ в фиксированной 4-х байтовой длине, но никто не использует его для хранения символов из-за нехватки места для хранения.
Многобайтовый набор символов может состоять как из однобайтовых, так и из двухбайтовых символов. Таким образом, многобайтовая символьная строка может содержать смесь однобайтовых и двухбайтовых символов.
Первый - хотя термин "кодирование переменной длины" был бы более уместным.
Я обычно использую его для обозначения любого символа, который может иметь более одного байта на символ.
Обычно первый, то есть UTF-8-подобный. Для получения дополнительной информации см. Кодирование переменной ширины.