Я немного запутался в кодировках. Насколько я знаю, старые символы ASCII занимали один байт на символ. Сколько байтов требуется для символа Юникода?
Я предполагаю, что один символ Unicode может содержать все возможные символы из любого языка - я прав? Так сколько байт нужно для каждого символа?
А что означают UTF-7, UTF-6, UTF-16 и т. Д.? Это разные версии Unicode?
Я прочитал статью про Unicode из Википедии, но это довольно сложно для меня. Я с нетерпением жду простого ответа.
string
language-agnostic
unicode
encoding
бабушка
источник
источник
Ответы:
Вы не увидите простого ответа, потому что его нет.
Во-первых, Unicode не содержит «каждого символа из каждого языка», хотя, безусловно, пытается.
Юникод сам по себе является отображением, он определяет кодовые точки, а кодовая точка - это число, связанное обычно с символом. Обычно я говорю, потому что есть такие понятия, как объединение персонажей. Вы можете быть знакомы с такими вещами, как акценты или умлауты. Они могут использоваться с другим символом, таким как
a
или,u
чтобы создать новый логический символ. Следовательно, символ может состоять из 1 или более кодовых точек.Чтобы быть полезным в вычислительных системах, нам нужно выбрать представление для этой информации. Это различные кодировки Unicode, такие как utf-8, utf-16le, utf-32 и т. Д. Они отличаются в основном размером их кодовых блоков. UTF-32 - простейшая кодировка, она имеет кодовый блок 32 бита, что означает, что отдельная кодовая точка удобно вписывается в кодовый блок. В других кодировках будут ситуации, когда для кодовой точки потребуется несколько кодовых единиц или эта конкретная кодовая точка вообще не может быть представлена в кодировке (это проблема, например, для UCS-2).
Из-за гибкости объединения символов, даже в данной кодировке число байтов на символ может варьироваться в зависимости от символа и формы нормализации. Это протокол для работы с символами, которые имеют более одного представления (можно сказать,
"an 'a' with an accent"
что это 2 кодовые точки, одна из которых представляет собой объединяющий символ или"accented 'a'"
одна кодовая точка).источник
Как ни странно, никто не указал, как рассчитать, сколько байтов занимает один символ Unicode. Вот правило для строк в кодировке UTF-8:
Итак, быстрый ответ: он занимает от 1 до 4 байтов, в зависимости от первого, который будет указывать, сколько байтов он займет.
источник
Я знаю, что этот вопрос старый и уже имеет принятый ответ, но я хочу предложить несколько примеров (надеясь, что он кому-нибудь пригодится).
Правильно. На самом деле, поскольку ASCII является 7-битной кодировкой, он поддерживает 128 кодов (95 из которых могут быть напечатаны), поэтому он использует только половину байта (если это имеет смысл).
Юникод просто отображает символы в кодовые точки. Это не определяет, как их кодировать. Текстовый файл не содержит символов Unicode, но байты / октеты, которые могут представлять символы Unicode.
Но почти Так что в основном да. Но все же нет.
То же, что ваш второй вопрос.
Нет, это кодировки. Они определяют, как байты / октеты должны представлять символы Unicode.
Пара примеров. Если некоторые из них не могут быть отображены в вашем браузере (возможно, потому что шрифт не поддерживает их), перейдите к
http://codepoints.net/U+1F6AA
(замените1F6AA
код в шестнадцатеричном коде), чтобы увидеть изображение.a
©
®
ጷ
—
‰
€
™
☃
☎
☔
☺
⚑
⚛
✈
✞
〠
肉
💩
🚀
Хорошо, я увлекаюсь ...
Забавные факты:
источник
00A9
вместо00 A9
(которое будет UTF-16BE).Проще говоря
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:
10FFFF является последней кодовой точкой Юникода по определению, и она определена таким образом, потому что это технический предел UTF-16.
Это также самая большая кодовая точка, которую UTF-8 может кодировать в 4 байта, но идея кодирования UTF-8 также работает для 5- и 6-байтовых кодировок, чтобы покрыть кодовые точки до 7FFFFFFF, т.е. половина того, что может UTF-32.
источник
В Unicode ответ дается нелегко. Проблема, как вы уже указали, заключается в кодировках.
Учитывая любое английское предложение без диакритических символов, ответ для UTF-8 будет столько же байтов, сколько символов, а для UTF-16 это будет число символов, умноженное на два.
Единственная кодировка, где (на данный момент) мы можем сделать утверждение о размере, это UTF-32. Там всегда 32 бит на символ, хотя я представляю, что кодовые точки подготовлены для будущего UTF-64 :)
Что делает это настолько сложным, это как минимум две вещи:
U+20AC
может быть представлен в виде трехбайтовой последовательностиE2 82 AC
или четырехбайтовой последовательностиF0 82 82 AC
.источник
В UTF-8 есть отличный инструмент для вычисления байтов любой строки: http://mothereff.in/byte-counter
Обновление: @mathias сделал код открытым: https://github.com/mathiasbynens/mothereff.in/blob/master/byte-counter/eff.js
источник
Ну, я только что поднял страницу Википедии на ней, и во вступительной части я увидел, что «Юникод может быть реализован различными кодировками символов. Наиболее часто используемые кодировки - это UTF-8 (который использует один байт для любых символов ASCII, которые имеют одни и те же кодовые значения в кодировке UTF-8 и ASCII и до четырех байтов для других символов), теперь устаревший UCS-2 (который использует два байта для каждого символа, но не может кодировать каждый символ в текущем стандарте Unicode) "
Как видно из этой цитаты, ваша проблема в том, что вы предполагаете, что Unicode - это единственный способ кодирования символов. На самом деле существует множество форм Unicode, и, опять же, в той цитате, одна из них даже имеет 1 байт на символ, как вы привыкли.
Итак, ваш простой ответ, который вы хотите, это то, что он меняется.
источник
Для UTF-16 персонажу нужны четыре байта (две кодовые единицы), если он начинается с 0xD800 или больше; такой персонаж называется «суррогатная пара». Более конкретно, суррогатная пара имеет вид:
где [...] указывает двухбайтовую кодовую единицу с заданным диапазоном. Все, что <= 0xD7FF - это одна кодовая единица (два байта). Все>> 0xE000 недопустимо (за исключением маркеров спецификации, возможно).
См. Http://unicodebook.readthedocs.io/unicode_encodings.html , раздел 7.5.
источник
Проверьте этот конвертер кода Unicode . Например, введите
0x2009
, где 2009 - номер Unicode для тонкого пространства , в поле «0x ... нотация» и нажмите «Преобразовать». Шестнадцатеричное числоE2 80 89
(3 байта) появляется в поле «Единицы кода UTF-8».источник
Из вики:
Это три самых популярных разных кодировки.
источник
Unicode
это стандарт, который предоставляет уникальный номер для каждого символа. Эти уникальные числа называютсяcode point
s (это просто уникальный код) для всех символов, существующих в мире (некоторые еще нужно добавить).Для разных целей вам может потребоваться представить это
code points
в байтах (большинство языков программирования так и делают), и вот гдеCharacter Encoding
начинается.UTF-8
,UTF-16
,UTF-32
И так далее всеCharacter Encodings
, и кодовые точки в наборах Unicode представлены в этих кодировках, по - разному.UTF-8
кодирование имеет длину переменной ширины, и символы, закодированные в нем, могут занимать от 1 до 4 байт включительно;UTF-16
имеет переменную длину и символы, закодированные в нем, могут занимать 1 или 2 байта (то есть 8 или 16 бит). Это представляет только часть всех символов Unicode, называемых BMP (базовая многоязычная плоскость), и этого достаточно для почти всех случаев. Java используетUTF-16
кодирование для своих строк и символов;UTF-32
имеет фиксированную длину, и каждый символ занимает ровно 4 байта (32 бита).источник