Что такое Unicode, UTF-8, UTF-16?

Какая основа для Unicode и зачем нужна UTF-8 или UTF-16? Я исследовал это в Google и искал здесь, но это мне не понятно.

В VSS при сравнении файлов иногда появляется сообщение о том, что два файла имеют разные UTF. Почему это так?

Пожалуйста, объясните просто.

338
11 февр. '10 в 3:12
источник поделиться
10 ответов

Зачем нужен Юникод?

В (не слишком) ранние дни все, что существовало, было ASCII. Это было нормально, так как все, что когда-либо понадобилось, было несколько контрольных символов, знаков препинания, цифр и букв, подобных тем, которые приведены в этом предложении. К сожалению, сегодня странный мир глобальных коммуникаций и социальных сетей не был предвиден, и не слишком необычно видеть английский, العربية, 汉语, עִבְרִית, ελληνικά и ភាសាខ្មែរ в том же документе (надеюсь, что я не сломал старые браузеры).

Но ради аргумента, скажем, Joe Average - разработчик программного обеспечения. Он настаивает на том, что ему понадобится только английский, и как таковой хочет использовать только ASCII. Это может быть хорошо для пользователя Joe, но это плохо для Joe разработчика программного обеспечения. Примерно половина мира использует нелатинские символы, и использование ASCII, возможно, не учитывает этих людей, и, кроме того, он закрывает свое программное обеспечение для большой и растущей экономики.

Следовательно, требуется набор символов, включающий все языки. Так появился Unicode. Он присваивает каждому символу уникальный номер, называемый кодовой точкой. Одним из преимуществ Unicode над другими возможными наборами является то, что первые 256 кодовых точек идентичны ISO-8859-1, а значит, и ASCII. Кроме того, подавляющее большинство обычно используемых символов могут быть представлены только двумя байтами в области, называемой Базовая многоязычная плоскость (BMP). Теперь для доступа к этому набору символов требуется кодировка символов, и, как будет задан вопрос, я сосредоточусь на UTF-8 и UTF-16.

Вопросы памяти

Итак, сколько байтов дает доступ к тем, какие символы в этих кодировках?

  • UTF-8:
    • 1 байт: стандартный ASCII
    • 2 байта: арабский, иврит, большинство европейских сценариев (в первую очередь исключая Georgian)
    • 3 байта: BMP
    • 4 байта: все символы Юникода
  • UTF-16:
    • 2 байта: BMP
    • 4 байта: все символы Юникода

Теперь стоит упомянуть, что персонажи, не входящие в BMP, включают древние сценарии, математические символы, музыкальные символы и реже китайский/японский/корейский (CJK) символов.

Если вы будете работать в основном с ASCII-символами, то UTF-8, безусловно, будет более эффективным с точки зрения памяти. Однако, если вы работаете в основном с неевропейскими сценариями, использование UTF-8 может быть в 1,5 раза меньше памяти, чем UTF-16. При работе с большими объемами текста, например большими веб-страницами или длинными текстовыми документами, это может повлиять на производительность.

Основы кодирования

Примечание. Если вы знаете, как кодируются UTF-8 и UTF-16, перейдите к следующему разделу для практических приложений.

  • UTF-8: Для стандартных символов ASCII (0-127) коды UTF-8 идентичны. Это делает UTF-8 идеальным, если требуется обратная совместимость с существующим текстом ASCII. Другие символы требуют от 2 до 4 байтов. Это делается путем резервирования некоторых бит в каждом из этих байтов, чтобы указать, что он является частью многобайтового символа. В частности, первый бит каждого байта 1, чтобы избежать столкновения с символами ASCII.
  • UTF-16: Для действительных символов BMP представление UTF-16 - это просто его кодовая точка. Однако для символов, отличных от BMP, UTF-16 вводит суррогатные пары. В этом случае комбинация двух двухбайтовых частей отображает символ без BMP. Эти двухбайтовые части поступают из числового диапазона BMP, но гарантируются стандартом Unicode как недействительные в качестве символов BMP. Кроме того, поскольку UTF-16 имеет два байта в качестве основного элемента, на него влияет endianness. Чтобы компенсировать, зарезервированный знак байта может быть помещен в начале потока данных, который указывает на сущность. Таким образом, если вы читаете вход UTF-16 и не указали его, вы должны проверить это.

Как видно, UTF-8 и UTF-16 нигде не совместимы друг с другом. Поэтому, если вы делаете ввод-вывод, убедитесь, что знаете, какую кодировку вы используете! Более подробную информацию об этих кодировках см. В разделе Часто задаваемые вопросы UTF.

Практические соображения программирования

Типы данных символов и строк:Как они кодируются на языке программирования? Если они являются необработанными байтами, то в минуту, когда вы пытаетесь вывести символы, отличные от ASCII, вы можете столкнуться с несколькими проблемами. Кроме того, даже если тип символа основан на UTF, это не означает, что строки являются правильными UTF. Они могут разрешать байтовые последовательности, которые являются незаконными. Как правило, вам придется использовать библиотеку, поддерживающую UTF, такую ​​как ICU для C, С++ и Java. В любом случае, если вы хотите ввести/вывести что-то, отличное от кодировки по умолчанию, вам сначала придется преобразовать его.

Рекомендуемые/стандартные/доминирующие кодировки: При выборе варианта использования UTF обычно лучше следовать рекомендуемым стандартам для среды, в которой вы работаете. Например, UTF-8 доминирующей в Интернете, а с HTML5 это рекомендуемая кодировка. И наоборот, среда .NET и Java основана на типе символов UTF-16. Смутно (и неправильно) часто ссылаются на "кодировку Unicode", которая обычно относится к доминирующей кодировке UTF в данной среде.

Поддержка библиотеки: Какие кодировки используются библиотеками, которые вы используете? Поддерживают ли они угловые случаи? Поскольку необходимость является матерью изобретений, библиотеки UTF-8 обычно поддерживают 4-байтовые символы, так как часто могут встречаться символы 1, 2 и даже 3 байта. Однако не все предполагаемые библиотеки UTF-16 правильно поддерживают суррогатные пары, поскольку они встречаются очень редко.

Counting characters: There exist combining characters in Unicode. For example the code point U+006E (n), and U+0303 (a combining tilde) forms ñ, but the code point U+00F1 forms ñ. They should look identical, but a simple counting algorithm will return 2 for the first example, 1 for the latter. This isn't necessarily wrong, but may not be the desired outcome either.

Comparing for equality: A, А, and Α look the same, but they're Latin, Cyrillic, and Greek respectively. You also have cases like C and Ⅽ, one is a letter, the other a Roman numeral. In addition, we have the combining characters to consider as well. For more info see Duplicate characters in Unicode.

Суррогатные пары: Они появляются достаточно часто на SO, поэтому я просто приведу несколько примеров ссылок:

Другие:

483
28 февр. '13 в 8:24
источник

Связанные вопросы


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

  • Unicode
    • - это набор символов, используемых во всем мире.
  • UTF-8,
    • кодировка символов, способная кодировать все возможные символы (называемые кодовыми точками) в Юникоде.
    • блок кода - 8 бит
    • используйте один-четыре блока кода для кодирования Unicode
    • 00100100 для $ "(один 8 бит) 11000010 10100010 для ¢" два 8 бит) 11100010 10000010 10101100 для "(три 8-битных)
  • UTF-16
    • кодировка другого символа
    • блок кода - 16 бит.
    • используйте один-два блока кода для кодирования Unicode
    • 00000000 00100100 для $ "(один 16-разрядный); 11011000 01010010 11011111 01100010 для 𤭢 > " (два 16-битных)
57
06 янв. '15 в 10:45
источник

Юникод - довольно сложный стандарт. Не слишком бойтесь, но будьте подготовленный для некоторой работы! [2]

Поскольку надежный ресурс всегда необходим, но официальный отчет массивный, я предлагаю прочитать следующее:

Краткое объяснение:

Компьютеры читают байты, а люди читают символы, поэтому мы используем стандарты кодирования для сопоставления символов байтам. ASCII был первым широко используемым стандартом, но охватывает только латынь (7 бит/символ может представлять 128 разных символов). Unicode является стандартом с целью охватить все возможные символы в мире (может содержать до 1114112 символов, что означает 21 бит/символ. Текущий Unicode 8.0 содержит всего 120 737 символов и все).

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

Каждый символ имеет перечислимую позицию от 0 до 1,114,111 (hex: 0-10FFFF), называемую кодовой точкой.
Форма кодирования отображает кодовую точку в последовательность кода. Блок кода - это то, как вы хотите, чтобы символы были организованы в память, 8-битные единицы, 16-битные единицы и так далее. UTF-8 использует от 1 до 4 единиц из 8 бит, а UTF-16 использует 1 или 2 блока по 16 бит, чтобы охватить весь Unicode максимум 21 бит. Единицы используют префиксы, чтобы границы символов могли быть замечены, а больше единиц - больше префиксов, которые занимают биты. Итак, хотя UTF-8 использует 1 байт для латинского script, ему требуется 3 байта для последующих скриптов внутри Basic Multilingual Plane, тогда как UTF-16 использует 2 байта для всех этих. И это их основное различие.
Наконец, схема кодирования (например, UTF-16BE или UTF-16LE) отображает (сериализует) последовательность блоков кода в последовательность байтов.

символ: π
код: U + 03C0
формы кодирования (единицы кода):
    UTF-8: CF 80
    UTF-16: 03C0
схемы кодирования (байты):
    UTF-8: CF 80
    UTF-16BE: 03 C0
    UTF-16LE: C0 03

Совет: шестнадцатеричная цифра представляет собой 4 бита, поэтому двухзначное шестнадцатеричное число представляет собой байтовое значение Также взгляните на карты Plane в Википедии, чтобы получить представление о макете набора символов

25
27 окт. '15 в 4:03
источник

Первоначально Unicode предполагалось иметь 16-битную кодировку с фиксированной шириной (UCS-2). Ранние пользователи Unicode, такие как Java и Windows NT, построили свои библиотеки вокруг 16-разрядных строк.

Позже область Unicode была расширена, чтобы включать в себя исторические символы, для чего потребуется более 65 536 кодовых точек, поддерживаемых 16-разрядной кодировкой. Чтобы позволить дополнительным символам быть представленными на платформах, которые использовали UCS-2, была введена кодировка UTF-16. Он использует "суррогатные пары" для представления символов в дополнительных плоскостях.

Между тем, многие старые программные и сетевые протоколы использовали 8-битные строки. UTF-8 был создан таким образом, чтобы эти системы могли поддерживать Unicode без использования широких символов. Он обратно совместим с 7-разрядным ASCII.

18
05 июля '10 в 8:04
источник

В этой статье описаны все детали http://kunststube.net/encoding/

ПИСЬМО К БУФЕРУ

если вы пишете в 4-байтовый буфер, символ с кодировкой UTF8, ваш двоичный файл будет выглядеть так:

00000000 11100011 10000001 10000010

если вы пишете в 4-байтовый буфер, символ с кодировкой UTF16, ваш двоичный файл будет выглядеть так:

00000000 00000000 00110000 01000010

Как вы можете видеть, в зависимости от того, какой язык вы будете использовать в своем контенте, это повлияет на вашу память.

например, для этого конкретного символа: кодировка UTF16 более эффективна, так как у нас есть 2 запасных байта для использования для следующего символа. Но это не значит, что вы должны использовать UTF16 для японского алфавита.

ЧТЕНИЕ БУФЕРА

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

например, если вы декодируете это: 00000000 11100011 10000001 10000010 в кодировку UTF16, вы получите не

Примечание. Кодировка и Юникод - это две разные вещи. Юникод - это большая (таблица) с каждым символом, сопоставленным с уникальной точкой кода. например, символ (буква) имеет (кодовая точка): 30 42 (шестнадцатеричный). Кодирование, с другой стороны, является алгоритмом, который преобразует символы в более подходящий способ при хранении на аппаратное обеспечение.

30 42 (hex) - > UTF8 encoding - > E3 81 82 (hex), which is above result in binary.

30 42 (hex) - > UTF16 encoding - > 30 42 (hex), which is above result in binary.

enter image description here

11
18 янв. '17 в 1:41
источник

Почему юникод? Поскольку ASCII имеет всего 127 символов. Те, кто от 128 до 255, различаются в разных странах, почему существуют кодовые страницы. Поэтому они сказали, что имеют до 1114111 символов. Итак, как вы храните самый высокий код? Вам нужно будет сохранить его, используя 21 бит, поэтому вы будете использовать DWORD, имеющий 32 бита с 11 бит впустую. Поэтому, если вы используете DWORD для хранения символа юникода, это самый простой способ, потому что значение в вашем DWORD точно соответствует коду. Но массивы DWORD, конечно, больше, чем массивы WORD и, конечно, даже больше, чем байт BYTE. Вот почему есть не только utf-32, но и utf-16. Но utf-16 означает поток WORD, а WORD имеет 16 бит, и как может самый высокий код 1114111 вписываться в WORD? Это не может! Поэтому они ставят все выше 65535 в DWORD, которые они называют суррогатной парой. Такая суррогатная пара является двумя СЛОВАМИ и может быть обнаружена при просмотре первых 6 бит. Так как насчет utf-8? Это байтовый массив или поток байтов, но как может самый высокий код 1114111 вписываться в байты? Это не может! Ладно, они тоже вписали DWORD? Или, возможно, СЛОВО? Почти правильно! Они изобрели последовательности utf-8, что означает, что каждый кодовый номер выше 127 должен быть закодирован в 2-байтную, 3-байтную или 4-байтную последовательность. Вау! Но как мы можем обнаружить такие последовательности? Ну, все до 127 - это ASCII и один байт. То, что начинается с 110, представляет собой двухбайтную последовательность, то, что начинается с 1110, представляет собой трехбайтную последовательность, и то, что начинается с 11110, представляет собой четырехбайтную последовательность. Остальные биты этих так называемых "стартбайтов" относятся к кодовой точке. Теперь, в зависимости от последовательности, должны следовать следующие байты. Следующий байт начинается с 10, остальные бит - 6 бит битов полезной нагрузки и принадлежат кодовому адресу. Объедините бит полезной нагрузки стартового байт и следующий байт/с, и вы получите код. Это все волшебство utf-8.

9
15 янв. '14 в 17:02
источник

Unicode - это стандарт, который отображает символы на всех языках в определенное числовое значение, называемое Code Points. Причина этого заключается в том, что он позволяет использовать разные кодировки с использованием одного и того же набора кодовых точек.

UTF-8 и UTF-16 являются двумя такими кодировками. Они принимают кодовые точки в качестве входных данных и кодируют их, используя некоторую четко определенную формулу для получения кодированной строки.

Выбор конкретной кодировки зависит от ваших требований. Разные кодировки имеют разные требования к памяти, и в зависимости от символов, с которыми вы будете иметь дело, вы должны выбрать кодировку, которая использует наименьшую последовательность байтов для кодирования этих символов.

Для более подробной информации о Unicode, UTF-8 и UTF-16, вы можете проверить эту статью,

Что каждый программист должен знать о Unicode

8
25 марта '17 в 18:10
источник

ASCII - Программное обеспечение выделяет только 8 бит в памяти для данного символа. Он хорошо работает для английских и принятых (заимствованных слов, таких как фасад) символов, поскольку их соответствующие десятичные значения опускаются ниже 128 в десятичном значении. Пример программы C.

UTF-8 - Программное обеспечение выделяет от 1 до 4 переменных 8 бит байтов для заданного символа. Что здесь означает переменная? Скажем, вы отправляете символ "A" через ваши HTML-страницы в браузере (HTML - UTF-8), соответствующее десятичное значение A равно 65, когда вы конвертируете его в десятичную, оно становится 01000010. Для этого требуется только 1 байт, 1 байтовая память выделяется даже для специальных принятых английских символов, таких как "ç" в слое фасад. Однако, когда вы хотите хранить европейские символы, для этого требуется 2 байта, поэтому вам нужен UTF-8. Однако, когда вы идете для азиатских символов, вам требуется минимум 2 байта и максимум 4 байта. Аналогично, Emoji требует от 3 до 4 байтов. UTF-8 решит все ваши потребности.

UTF-16 будет выделять минимум 2 байта и максимум 4 байта на символ, он не будет выделять 1 или 3 байта. Каждый символ либо представлен в 16 бит, либо 32 бит.

Тогда почему существует UTF-16? Первоначально Unicode был 16 бит, а не 8 бит. Java приняла исходную версию UTF-16.

Вкратце, вам не нужен UTF-16 где угодно, если он уже не был принят языком или платформой, над которой вы работаете.

Программа Java, вызываемая веб-браузерами, использует UTF-16, но веб-браузер отправляет символы с использованием UTF-8.

4
06 дек. '18 в 11:41
источник

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

UTF-8 имеет возможности кодирования символов, а его код - 8 бит, а для UTF-16 - 16 бит.

2
30 авг. '16 в 12:39
источник

Домены IDN (Международное доменное имя) и используйте Unicode (UTF-8) для форматирования домена. Инструмент конвертации домена IDN позволяет конвертировать домены ASCII в Unicode и Unicode до ASCII.

Попробуйте здесь unicode: Инструмент конвертации Unicode

-1
07 дек. '16 в 15:46
источник

Посмотрите другие вопросы по меткам или Задайте вопрос