Сколько байт занимает один символ Юникода?
Я немного запутался в кодировках. Насколько я знаю, старые символы ASCII занимали один байт на символ. Сколько байт требуется для символа Юникода?
Я предполагаю, что один символ Юникода может содержать все возможные символы из любого языка - я прав? Итак, сколько байтов нужно для каждого символа?
а что делают UTF-7, UTF-6, UTF-16 и др. в смысле? Это разные версии Юникода?
прочитал статья в Википедии о Unicode но это довольно сложно для меня. Я с нетерпением жду простого ответа.
10 ответов:
вы не увидите простой ответ, потому что его нет.
во-первых, Unicode не содержит "каждый символ из каждого языка", хотя он обязательно пытается.
Юникод сам по себе является отображением, он определяет кодовые точки, А кодовая точка-это число, связанное с обычно символ. Я говорю обычно, потому что есть такие понятия, как сочетание символов. Вы можете быть знакомы с такими вещами, как акценты, или умляуты. Они могут быть использованы с другим персонажем, такие как
aилиuдля создания нового логического символа. Поэтому символ может состоять из 1 или более кодов.чтобы быть полезным в вычислительных системах, нам нужно выбрать представление для этого информацию. Это различные кодировки Юникода, такие как utf-8, utf-16le, utf-32 и т. д. Они отличаются в основном размером своих кодовых единиц. UTF-32-это самая простая кодировка, она имеет кодовый модуль, который составляет 32 бит, что означает, что индивидуальная кодовая точка подходит комфортно в центр. Другие кодировки будут иметь ситуации, когда кодовая точка будет нуждаться в нескольких кодовых единицах, или эта конкретная кодовая точка вообще не может быть представлена в кодировке (это проблема, например, с UCS-2).
из-за гибкости комбинирования символов, даже в пределах заданной кодировки количество байтов на символ может варьироваться в зависимости от символа и формы нормализации. Это протокол для работы с персонажами, которые имеют более чем одно представление (можно сказать
"an 'a' with an accent"который является 2 кодовыми точками, одна из которых является объединяющим символом или"accented 'a'"который является одной кодовой точкой).
Как ни странно, никто не указал, как рассчитать сколько байт занимает один символ Юникода. Вот правило для кодированных строк UTF-8:
Binary Hex Comments 0xxxxxxx 0x00..0x7F Only byte of a 1-byte character encoding 10xxxxxx 0x80..0xBF Continuation bytes (1-3 continuation bytes) 110xxxxx 0xC0..0xDF First byte of a 2-byte character encoding 1110xxxx 0xE0..0xEF First byte of a 3-byte character encoding 11110xxx 0xF0..0xF4 First byte of a 4-byte character encodingИтак, быстрый ответ: он занимает от 1 до 4 байт, в зависимости от первого, который укажет, сколько байтов он займет.
обновление
Как prewett указано, что это правило применяется только к UTF-8
я знаю, этот вопрос старый и уже есть принятый ответ, но я хочу предложить несколько примеров (надеюсь, что это будет полезно кому-то).
насколько я знаю, старые символы ASCII занимали один байт на символ.
право. На самом деле, поскольку ASCII является 7-битным кодированием, он поддерживает 128 кодов (95 из которых можно распечатать), поэтому он использует только половину байта (если это имеет смысл).
сколько байт делает Юникод характер требуют?
Unicode просто отображает символы в кодовые точки. Он не определяет, как их кодировать. Текстовый файл не содержит символов Юникода, но байты/октеты, которые могут представлять символы Юникода.
я полагаю, что один символ Юникода может содержать все возможные символ из любого языка - я прав?
нет. Но почти. Так что в принципе да. Но все равно нет.
Так сколько байты это нужно на символ?
то же, что и ваш 2-й вопрос.
а что означают UTF-7, UTF-6, UTF-16 и т. д.? Они что-то вроде Юникода версии?
нет, это кодировки. Они определяют, как байты / октеты должны представлять символы Юникода.
пара примеров. Если некоторые из них не могут быть отображены в вашем браузере (вероятно, потому, что шрифт не поддерживает их), перейдите в
http://codepoints.net/U+1F6AA(заменить1F6AAс кодовой точкой в шестнадцатеричном формате), чтобы увидеть изображение.
- U + 0061 ЛАТИНСКАЯ СТРОЧНАЯ БУКВА A:
a
- Nº: 97
- UTF-8: 61
- UTF-16: 00 61
- U+00A9 ЗНАК АВТОРСКОГО ПРАВА:
©
- Nº: 169
- UTF-8: C2 A9
- UTF-16: 00 A9
- U+00AE ЗАРЕГИСТРИРОВАННЫЙ ЗНАК:
®
- Nº: 174
- UTF-8: C2 AE
- UTF-16: 00 AE
- U+1337 ЭФИОПСКИЙ СЛОГ PHWA:
ጷ
- Nº: 4919
- UTF-8: E1 8C B7
- UTF-16: 13 37
- U + 2014 EM DASH:
—
- Nº: 8212
- UTF-8: E2 80 94
- UTF-16: 20 14
- U+2030 ЗА МИЛЛЬ ЗНАК:
‰
- Nº: 8240
- UTF-8: E2 80 B0
- UTF-16: 20 30
- ЗНАК ЕВРО U+20AC:
€
- Nº: 8364
- UTF-8: E2 82 AC
- UTF-16: 20 AC
- U+2122 ЗНАК ТОРГОВОЙ МАРКИ:
™
- Nº: 8482
- UTF-8: E2 84 A2
- UTF-16: 21 22
- U+2603 СНЕГОВИК:
☃
- Nº: 9731
- UTF-8: E2 98 83
- UTF-16: 26 03
- U + 260E ЧЕРНЫЙ ТЕЛЕФОН:
☎
- Nº: 9742
- UTF-8: E2 98 8E
- UTF-16: 26 0E
- U+2614 ЗОНТИК С КАПЛЯМИ ДОЖДЯ:
☔
- Nº: 9748
- UTF-8: E2 98 94
- UTF-16: 26 14
- U + 263A БЕЛОЕ УЛЫБАЮЩЕЕСЯ ЛИЦО:
☺
- Nº: 9786
- UTF-8: E2 98 BA
- UTF-16: 26 3A
- U + 2691 ЧЕРНЫЙ ФЛАГ:
⚑
- Nº: 9873
- UTF-8: E2 9A 91
- UTF-16: 26 91
- U+269B СИМВОЛ АТОМА:
⚛
- Nº: 9883
- UTF-8: E2 9A 9B
- UTF-16: 26 9B
- U+2708 САМОЛЕТ:
✈
- Nº: 9992
- UTF-8: E2 9C 88
- UTF-16: 27 08
- U + 271E ЗАТЕНЕННЫЙ БЕЛЫЙ ЛАТИНСКИЙ КРЕСТ:
✞
- Nº: 10014
- UTF-8: E2 9C 9E
- UTF-16: 27 1E
- U + 3020 ПОЧТОВЫЙ ЗНАК ЛИЦО:
〠
- Nº: 12320
- UTF-8: E3 80 А0
- UTF-16: 30 20
- U+8089 CJK UNIFIED IDEOGRAPH-8089:
肉
- Nº: 32905
- UTF-8: E8 82 89
- UTF-16: 80 89
- U + 1F4A9 КУЧА КАКАШЕК:
- Nº: 128169
- UTF-8: F0 9F 92 A9
- UTF-16: D8 3D DC A9
- U+1F680 ROCKET:
- Nº: 128640
- UTF-8: F0 9F 9A 80
- UTF-16: D8 3D DE 80
ОК Я уже увлекся...
интересные факты:
- если вы ищете конкретный символ, вы можете скопировать и вставить его на http://codepoints.net/.
- я потратил много времени на этот бесполезный список (но он отсортирован!).
- MySQL имеет кодировку под названием "utf8", которая на самом деле не поддерживает символы длиной более 3 байт. Так что вы не можете вставить кучу ПУ, поле будет просто обрезаются. Использовать "utf8" вместо этого.
- здесь тестовая страница снеговика (unicodesnowmanforyou.com).
проще говоря
Unicode- это стандарт, который присваивает один номер (называемый кодовой точкой) всем символам мира (его работа все еще продолжается).теперь вам нужно представить этот код точки с помощью байтов, что называется
character encoding.UTF-8, UTF-16, UTF-6способы представления этих символов.
UTF-8- это многобайтовая кодировка. Символы могут иметь от 1 до 6 байт (некоторые из них могут не потребоваться прямо сейчас).
UTF-32каждый символ имеет 4 байта характер.
UTF-16использует 16 бит для каждого символа, и он представляет только часть символов Unicode, называемых BMP (для всех практических целей его достаточно). Java использует эту кодировку в своих строках.
в Юникоде ответ дается нелегко. Проблема, как вы уже указали, заключается в кодировках.
учитывая любое английское предложение без диакритических символов, ответ для UTF-8 будет столько же байтов, сколько символов, а для UTF-16 это будет число символов, умноженное на два.
единственная кодировка, где (на данный момент) мы можем сделать заявление о размере UTF-32. Там всегда 32 бит на символ, хотя я предполагаю, что кодовые точки подготовлено для будущего UTF-64:)
что делает это так сложно, по крайней мере две вещи:
- составленные символы, где вместо использования объекта символа, который уже акцентирован / диакритический (À), пользователь решил объединить акцент и базовый символ (`A).
- кодовые точки. Кодовые точки-это метод, с помощью которого UTF-кодировки позволяют кодировать больше, чем обычно позволяет количество бит, которое дает им их имя. Например, UTF-8 обозначает определенные байты, которые сами по себе являются недопустимыми, но когда за ними следует допустимый байт продолжения, это позволит описать символ за пределами 8-битного диапазона 0..255. Смотрите примеры и слишком длинные кодировки ниже в статье Википедии на UTF-8.
- отличный пример, приведенный там, что € символ (кодовая точка
U+20ACможет быть представлена как три-байт последовательностьE2 82 ACили четыре-байт последовательностьF0 82 82 AC.- оба действительны, и это показывает, насколько сложным является ответ, когда речь идет о "Unicode", а не о конкретной кодировке Unicode, такой как UTF-8 или UTF-16.
в UTF-8:
1 byte: 0 - 7F (ASCII) 2 bytes: 80 - 7FF (all European plus some Middle Eastern) 3 bytes: 800 - FFFF (multilingual plane incl. the top 1792 and private-use) 4 bytes: 10000 - 10FFFFв UTF-16:
2 bytes: 0 - D7FF (multilingual plane except the top 1792 and private-use ) 4 bytes: D800 - 10FFFFв UTF-32:
4 bytes: 0 - 10FFFF10FFFF-это последняя кодовая точка unicode по определению, и она определена таким образом, потому что это Технический предел UTF-16.
Это также самая большая кодовая точка UTF-8 может кодироваться в 4 байта, но идея кодирования UTF-8 также работает для 5 и 6 байтовых кодировок для покрытия кодовых точек до 7FFFFFFF, т. е. половина того, что может UTF-32.
есть отличный инструмент для вычисления байтов любой строки в UTF-8:http://mothereff.in/byte-counter
обновление: @mathias сделал код открытым: https://github.com/mathiasbynens/mothereff.in/blob/master/byte-counter/eff.js
Ну я просто вытащил страницу Википедии на нем тоже, и в вводной части я увидел "Unicode может быть реализован различными кодировками символов. Наиболее часто используемые кодировки-UTF-8 (который использует один байт для любых символов ASCII, которые имеют одинаковые значения кода как в кодировке UTF-8, так и в кодировке ASCII, и до четырех байтов для других символов), теперь устаревший UCS-2 (который использует два байта для каждого символа, но не может кодировать каждый символ в текущем Unicode стандартный)"
Как показывает эта цитата, ваша проблема заключается в том, что вы предполагаете, что Unicode является единственным способом кодирования символов. На самом деле существует несколько форм Юникода, и, опять же в этой цитате, один из них даже имеет 1 байт на символ, как и то, к чему вы привыкли.
Итак, ваш простой ответ, который вы хотите, заключается в том, что он меняется.
для UTF-16 символу требуется четыре байта (две единицы кода), если он начинается с 0xD800 или больше; такой символ называется "суррогатной парой"."Более конкретно, суррогатная пара имеет вид:
[0xD800 - 0xDBFF] [0xDC00 - 0xDFF]где [...] обозначает двухбайтовый кодовый блок с заданным диапазоном. Все, что = 0xE000 недопустимо (за исключением маркеров спецификации, возможно).
посмотреть http://unicodebook.readthedocs.io/unicode_encodings.html, раздел 7.5.
зацените Unicode code converter. Например, введите
0x2009, где 2009-Это номер Юникода для тонкого пространства, в "0x... поле "нотация" и нажмите кнопку Преобразовать. Шестнадцатеричное числоE2 80 89(3 байта) появляется в поле "кодовые единицы UTF-8".
Comments