UTF-8, UTF-16 и UTF-32 отличаются по количеству символов, которые они могут сохранить?

47
задан phuclv 9 September 2018 в 23:37
поделиться

6 ответов

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

UTF-8 использует где угодно от одного до четырех байтов за символ в зависимости от того, какой символ Вы кодируете. Символы в диапазоне ASCII берут только один байт, в то время как очень необычные символы берут четыре.

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

UTF-16 использует два байта для большей части charactes, четыре байта для необычных.

http://en.wikipedia.org/wiki/Comparison_of_Unicode_encodings

40
ответ дан skoob 7 November 2019 в 13:06
поделиться

UTF-8, UTF-16 и UTF-32 вся поддержка полный набор unicode кодовых точек. Нет никаких символов, которые поддерживаются одним, но не другим.

Что касается вопроса о премии "Эта кодировка отличается по количеству символов, они могут быть расширены на поддержку?" Да и нет. Путем UTF-8 и UTF-16 кодируются, ограничивает общее количество кодовых точек, к которым они могут поддерживать меньше, чем 2^32. Однако Консорциум Unicode не добавит кодовые точки к UTF-32, который не может быть представлен в UTF-8 или UTF-16. Выполнение так нарушило бы дух стандартов кодирования и лишило бы возможности гарантировать непосредственное отображение от UTF-32 до UTF-8 (или UTF-16).

7
ответ дан Derek Park 7 November 2019 в 13:06
поделиться

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

UTF-8

UTF-8 является неравномерным кодом. Некоторые символы требуют 1 байта, некоторые требуют 2, приблизительно 3 и приблизительно 4. Байты для каждого символа просто записаны один за другим как непрерывный поток байтов.

, В то время как некоторые символы UTF-8 могут быть 4 байта длиной, UTF-8 не может закодировать 2^32 символы . Это даже не близко. Я попытаюсь объяснить причины этого.

программное обеспечение, которое читает поток UTF-8 просто, получает последовательность байтов - как оно, как предполагается, решает, являются ли следующие 4 байта единственным 4-байтовым символом, или двумя 2-байтовыми символами или четырьмя 1-байтовыми символами (или некоторая другая комбинация)? В основном это сделано путем решения, что определенные 1-байтовые последовательности не являются допустимыми символами, и определенные 2-байтовые последовательности не являются допустимыми символами и так далее. Когда эти недопустимые последовательности появляются, предполагается, что они являются частью дольше последовательность.

Вы видели довольно различный пример этого, я уверен: это назвало выход. На многих языках программирования решено, чтобы \ символ в исходном коде строки не переводил ни в какой допустимый символ в "скомпилированной" форме строки. Когда \найден в источнике, он, как предполагается, часть более длинной последовательности, как \n или \xFF. Обратите внимание, что \x недопустимая 2 последовательности символов, и \xF недопустимая 3 последовательности символов, но \xFF допустимая 4 последовательности символов.

В основном, существует компромисс между наличием многих символов и наличием короче символов. Если Вы хотите 2^32 символы, они должны быть в среднем 4 байта длиной. Если Вы хотите, чтобы все Ваши символы составили 2 байта или меньше, то у Вас не может быть больше, чем 2^16 символы. UTF-8 дает разумный компромисс: весь символам ASCII (ASCII от 0 до 127) дают 1-байтовые представления, который является большим для совместимости, но намного больше символов позволяется.

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

, Например, символ 'A' представлен с помощью байта 65, и нет никаких two/three/four-byte символов, первый байт которых равняется 65. Иначе декодер не был бы в состоянии сказать те символы кроме сопровождаемый чем-то еще.

, Но UTF-8 ограничивается еще больше. Это гарантирует, что кодирование более короткого символа никогда не появляется нигде в рамках кодирования более длительного символа. Например, ни один из байтов в 4-байтовом символе не может быть 65.

, Так как UTF-8 имеет 128 различных 1-байтовых символов (чьи значения байта 0-127), все 2, 3-и 4-байтовые символы должны быть составлены только байтов в диапазоне 128-256. Это - большое ограничение. Однако это позволяет байтовым строковым функциям работать с минимальной модификацией. Например, C strstr() функция всегда работает как ожидалось, если ее исходные данные являются допустимыми строками UTF-8.

UTF-16

UTF-16 является также неравномерным кодом; его символы используют любые 2 или 4 байта. 2-байтовые значения в диапазоне 0xD800-0xDFFF резервируются для построения 4-байтовых символов, и все 4-байтовые символы состоят из двух байтов в диапазоне 0xD800-0xDBFF сопровождаемый на 2 байта в диапазоне 0xDC00-0xDFFF. Поэтому Unicode не присваивает символов в диапазоне U+D800-U+DFFF.

UTF-32

UTF-32 является кодом фиксированной длины с каждым символом, являющимся 4 байта длиной. В то время как это позволяет кодирование 2^32 различные символы, только значения между 0 и 0x10FFFF позволяются в этой схеме.

Полное сравнение:

  • UTF-8: 2,097,152 (на самом деле 2,166,912, но должный разработать детализирует некоторые из них, отображаются на то же самое)
  • UTF-16: 1,112,064
  • UTF-32: 4,294,967,296 (но ограниченный первыми 1,114,112)

наиболее ограниченным является поэтому UTF-16! Формальное определение Unicode ограничило символы Unicode теми, которые могут быть закодированы UTF-16 (т.е. диапазон U+0000 к U+10FFFF, исключая U+D800 к U+DFFF). UTF-8 и UTF-32 поддерживают все эти символы.

система UTF-8 на самом деле "искусственно" ограничена 4 байтами. Это может быть расширено на 8 байтов, не нарушая ограничения, которые я обрисовал в общих чертах ранее, и это приведет к способности 2^42. Исходная UTF-8 спецификация на самом деле позволила до 6 байтов, который дает способность 2^31. Но RFC 3629 ограничил его 4 байтами, с тех пор именно так много необходимо для покрытия всего из того, что делает UTF-16.

существуют другие (главным образом исторические) схемы кодирования Unicode, особенно UCS-2 (который только способен к кодированию U+0000 к U+FFFF).

58
ответ дан Artelius 7 November 2019 в 13:06
поделиться

Я лично всегда проверяю сообщение Joel о unicode, кодировке и наборах символов когда в сомнении.

5
ответ дан Atanas Korchev 7 November 2019 в 13:06
поделиться

Весь из UTF-8/16/32 кодировки может отобразить все символы Unicode. См. Сравнение Википедии Кодировки Unicode .

статья This IBM Кодирует Ваши XML-документы в UTF-8, очень полезно, и указывает, есть ли у Вас выбор, лучше выбрать UTF-8. Главным образом причинами является широкая поддержка инструмента, и UTF-8 может обычно , проходят через системы, которые не знают о unicode.

От раздела , Что спецификации говорят в статья IBM:

И W3C и IETF недавно стали более непреклонными по отношению к выбору UTF-8 сначала, в последний раз, и иногда только. Модель символов W3C для Всемирной паутины 1.0: состояния Основных принципов, "Когда уникальная кодировка символов требуется, кодировка символов ДОЛЖНА быть UTF-8, UTF-16 или UTF-32. US-ASCII вверх совместим с UTF-8 (строка US-ASCII является также строкой UTF-8, посмотрите [RFC 3629]), и UTF-8 является поэтому соответствующим, если совместимость с US-ASCII желаема". На практике совместимость с US-ASCII так полезна, это - почти требование. W3C мудро объясняет, "В других ситуациях, такой что касается API, UTF-16 или UTF-32 может быть более соответствующим. Возможные причины для выбора одного из них включают эффективность внутренней обработки и совместимости с другими процессами".

4
ответ дан Robert Paulson 7 November 2019 в 13:06
поделиться

Как все сказали, UTF-8, UTF-16, и UTF-32 может все закодировать все кодовые точки Unicode. Однако UCS-2 (иногда по ошибке называемый UCS-16) вариант не может <ударить>, и это - то, которое Вы находите, например, в Windows XP / Vista .

См. Википедия для получения дополнительной информации.

Редактирование: я неправ относительно Windows, NT был единственным для поддержки UCS-2. Однако много Приложений Windows примут отдельное слово на кодовую точку как в UCS-2, таким образом, Вы, вероятно, найдете ошибки. См. другая статья Wikipedia. (Спасибо JasonTrue)

2
ответ дан Mark Ransom 7 November 2019 в 13:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: