UTF-8: сетевой стандарт

Люди, которые читают веб-сайты на английском языке или электронные письма на японском, не просто свободно владеют этими языками, они, вероятно, также имели успешный опыт работы с UTF-8. «UTF-8 — это аббревиатура от «8-Bit UCS Transformation Format» и является наиболее широко используемым методом кодирования символов в Интернете. Международный стандарт Unicode охватывает все языковые символы и элементы текста (почти) всех языков мира для обработки ЭДП. UTF-8 играет важную роль в наборе символов Unicode.

Развитие кодирования UTF-8

UTF-8 — это форма кодирования символов. Она присваивает каждому существующему символу Unicode одну определенную последовательность битов, которая затем может быть прочитана как двоичное число. Это означает: UFT-8 присваивает фиксированное двоичное число всем буквам, цифрам и символам все большего числа языков. Международные организации, которые хотят установить интернет-стандарты и считают их важными, работают над тем, чтобы сделать UTF-8 неоспоримым стандартом кодирования. Среди прочих, W3C и Internet Engineering Task Force также привержены этой задаче. Фактически, большинство веб-сайтов в мире уже в 2009 году использовали кодировку UTF-8. В марте 2018 года, согласно отчету W3Techs, 90,9% всех существующих веб-сайтов уже используют этот метод кодирования символов.

Проблемы с внедрением UTF-8

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

Происхождение UTF-8

Для решения этой проблемы Джозеф Д. Беккер в 1988-1991 годах разработал для компании Xerox набор символов Unicode. С 1992 года консорциум ИТ-индустрии X/Open также искал систему, которая могла бы заменить ASCII и расширить репертуар символов. Тем не менее, кодировка должна была оставаться совместимой с ASCII. Этому требованию не соответствовала первая кодировка под названием UCS-2, которая просто переводила номера символов в 16-битные значения. UTF-1 также потерпела неудачу, поскольку назначения символов Unicode в итоге частично столкнулись с существующими назначениями символов ASCII. Сервер, настроенный на ASCII, иногда выдавал неправильные символы. Это было серьезной проблемой, поскольку в то время большинство англоязычных компьютеров работали с ним. Следующим шагом стал разработанный Дейвом Проссером «File System Safe UCS Transformation Format» (FSS-UTF), который устранил дублирование символов ASCII.

В августе того же года проект был проверен экспертами. В Bell Labs, известной своими многочисленными лауреатами Нобелевской премии, сооснователи Unix Кен Томпсон и Роб Пайк работали над операционной системой Plan 9. Они взяли идею Проссера, разработали метод самосинхронизирующегося кодирования (каждый символ указывает, сколько битов ему нужно) и определили правила назначения букв, которые могли отображаться в коде по-разному (например: «ä» как отдельный символ или «a+¨»). Они успешно использовали эту кодировку для своей операционной системы и представили ее другим. Теперь известная как «UTF-8», кодировка FSS-UTF была, по сути, завершена.

Определение

UTF-8 — это 8-битная кодировка символов для Юникода. Аббревиатура «UTF-8» означает «8-битный универсальный формат преобразования набора символов». От одного до четырех байтов, состоящих из восьми битов каждый, приводят к двоичному числу, читаемому компьютером. Оно присваивает кодировку языковому символу или другому элементу текста. Самосинхронизирующаяся структура и возможность генерировать 221 двоичное число позволяют безошибочно присвоить кодировку каждому языку и элементу текста для всех языков мира.

UTF-8 как набор символов Unicode: один стандарт для всех языков

Кодировка UTF-8 — это формат преобразования в рамках стандарта Unicode. Международный стандарт ISO 10646 определяет Юникод под названием «Универсальный набор кодированных символов». Разработчики Unicode ограничивают определенные параметры для практического использования, что призвано обеспечить глобально единообразное, совместимое кодирование символов и элементов текста. На момент своего появления в 1991 году Unicode определял 24 современные системы письма и валютные символы для обработки данных. В июне 2017 года их было 139.

Существуют различные форматы преобразования Юникода (сокращенно UTF), которые воспроизводят 1.114.112 возможных кодовых точек. Установлены три формата: UTF-8, UTF-16 и UTF-32. Другие кодировки, такие как UTF-7 или SCSU, также имеют свои преимущества, но не смогли утвердиться.

Юникод разделен на 17 уровней, каждый из которых содержит 65 536 символов. Каждый уровень состоит из 16 столбцов и 16 строк. Первый уровень, «Базовая многоязычная плоскость» (уровень 0), включает в себя большую часть систем письма, используемых в настоящее время во всем мире, а также знаки препинания, управляющие знаки и символы. В настоящее время также используются еще пять уровней:

  • «Дополнительная многоязычная плоскость» (уровень 1): исторические системы письма, редко используемые знаки.
  • «Дополнительная идеографическая плоскость» (уровень 2): редкие символы CJK (китайский, японский, корейский)
  • «Дополнительная плоскость специального назначения» (уровень 14): индивидуальные контрольные знаки
  • «Дополнительная зона частного использования — А» (уровень 15): частное использование
  • «Дополнительная зона частного использования — B» (уровень 16): частное использование.

Кодировки UTF позволяют получить доступ ко всем символам Юникода. Соответствующие свойства рекомендуются для определенных областей применения.

Альтернативы: UTF-32 и UTF-16

UTF-32 всегда работает с использованием 32 бит, т.е. 4 байт. Простая структура повышает удобочитаемость формата. В языках, использующих в основном латинский алфавит и, соответственно, только первые 128 символов, кодировка занимает гораздо больше памяти, чем необходимо (4 байта вместо 1).

UTF-16 зарекомендовал себя как формат отображения в таких операционных системах, как Apple macOS и Microsoft Windows, а также используется во многих фреймворках для разработки программного обеспечения. Это один из самых старых UTF, который до сих пор используется. Его структура особенно подходит для экономного кодирования нелатинских речевых символов. Большинство символов могут быть представлены в 2 байтах (16 бит), лишь редкие символы удваивают длину до 4 байт.

Эффективный и масштабируемый: UTF-8

UTF-8 состоит из четырех битовых цепочек, каждая из которых состоит из 8 бит. Его предшественник ASCII, с другой стороны, состоит из одной битовой цепочки с 7 битами. Обе кодировки одинаково определяют первые 128 кодируемых символов. Символы, которые в основном происходят из англоязычного мира, занимают по одному байту. Для языков с латинским алфавитом этот формат наиболее эффективно использует пространство для хранения данных. Операционные системы Unix и Linux используют его внутри себя. Однако UTF-8 играет наиболее важную роль, когда речь идет об интернет-приложениях, а именно о представлении текста в Интернете или в электронной почте.

Благодаря самосинхронизирующейся структуре, читабельность сохраняется, несмотря на переменную длину одного символа. Без ограничений Unicode, (= 4.398.046.511.104) назначение символов было бы возможным при использовании UTF-8, поскольку ограничение в 4 байта в Unicode фактически равно 221, что более чем достаточно. В области Юникода даже есть пустые слои для многих других систем письма. Точное назначение предотвращает наложение кодовых точек, которое ограничивало коммуникацию в прошлом. Хотя UTF-16 и UTF-32 также допускают точное сопоставление, UFT-8 использует пространство для хранения данных в латинской системе письма особенно эффективно, и разработан для того, чтобы различные системы письма могли сосуществовать и охватываться без проблем. Это позволяет одновременное, осмысленное отображение в текстовом поле без каких-либо проблем совместимости.

Основы: Кодировка и состав UTF-8

Кодировка UTF-8 обратно совместима с ASCII и имеет самосинхронизирующуюся структуру, что облегчает разработчикам последующее выявление источников ошибок. UTF использует только 1 байт для всех символов ASCII. Общее количество битовых цепочек обозначается первыми цифрами двоичного числа. Поскольку код ASCII содержит только 7 бит, первой цифрой является кодовое число 0. 0 заполняет пространство памяти до полного байта и сигнализирует о начале цепочки, которая не имеет последующих цепочек. Например, имя «UTF-8» будет выражено в виде двоичного числа с кодировкой UTF-8 следующим образом:

Символы U T F 8
UTF-8, двоичный 01010101 01010100 01000110 00101101 00111000
Точка Юникода, шестнадцатеричная U+0055 U+0054 U+0046 U+002D U+0038

Символы ASCII, подобные тем, что использованы в приведенной выше таблице, присваивают кодировке UTF-8 одну битовую строку. Все последующие знаки и символы в Юникоде имеют от двух до четырех 8-битных строк. Первая цепочка называется стартовым байтом; последующие цепочки — байтами последовательности. Стартовые байты с последовательными байтами всегда начинаются с 11. Последовательные байты всегда начинаются с 10. Если вы вручную ищете определенную точку в коде, вы сможете узнать начало закодированного символа по маркерам 0 и 11. Первым печатаемым многобайтовым символом является перевернутый восклицательный знак:

Символы ¡
UTF-8, двоичный 11000010 10100001
Unicode Point, шестнадцатеричный U+00A1

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

Еще один структурирующий элемент: количество единиц в начале стартового байта указывает на длину строки байтов. 110xxxxx означает 2 байта, как показано выше. 1110xxx означает 3 байта, 11119xxx — 4 байта. В Юникоде назначенное значение байта соответствует номеру символа, что позволяет установить лексический порядок. Однако существуют пробелы. Диапазон Юникода от U+007F до U+009F включает присвоенные контрольные номера. Стандарт UTF-8 не назначает там печатаемых символов, только команды.

Теоретически кодировка UTF-8 может объединять до восьми цепочек байтов. Но Юникод требует максимальной длины в 4 байта. Одним из следствий этого является то, что байтовые строки длиной 5 и более байт по умолчанию являются недействительными. С другой стороны, это ограничение отражает стремление представить код как можно более компактным — т.е. с минимальной загрузкой пространства для хранения — и как можно более структурированным. Основное правило при использовании UTF-8 заключается в том, что всегда следует использовать максимально короткое кодирование. Например, буква ä кодируется 2 байтами: 11000011 10100100. Теоретически можно объединить кодовые точки для буквы a(01100001) и дневникового знака ¨ (11001100 10001000) для представления ä: 01100001 11001100 10001000. Однако такая форма считается слишком длинным кодом для UTF-8, что делает ее неприемлемой.

Примечание

Это правило является причиной того, что последовательности байтов, начинающиеся с 192 и 193, недопустимы. Это связано с тем, что они потенциально представляют символы в диапазоне ASCII (0-127) с помощью 2 байтов, которые уже закодированы с помощью 1 байта.

Некоторые диапазоны значений Unicode не были определены для UTF-8, поскольку они доступны для суррогатов UTF-16. В обзоре показано, какие байты допустимы в UTF-8 в соответствии с Unicode согласно Internet Engineering Task Force (IETF). Отмеченные зеленым цветом области — допустимые байты; отмеченные красным — недопустимые).

Преобразование из шестнадцатеричной системы Unicode в двоичную UTF-8

Компьютеры читают только двоичные числа; люди используют десятичную систему. Интерфейсом между этими формами является шестнадцатеричная система. Она помогает сделать длинные битовые цепочки компактными. Она использует цифры от 0 до 9 и буквы от A до F и действует на основе числа 16. Поскольку шестнадцатеричная система является четвертой степенью от 2, она лучше подходит для представления восьмизначных диапазонов байтов, чем десятичная система. Шестнадцатеричная цифра обозначает ниббл октета. Тогда байт с восемью двоичными цифрами может быть представлен только двумя шестнадцатеричными цифрами. Юникод использует шестнадцатеричную систему для описания положения символа в своей собственной системе. Код UTF-8 может быть вычислен из этого двоичного числа.

Сначала двоичное число должно быть преобразовано из шестнадцатеричного. Затем кодовые точки вписываются в структуру кодировки UTF-8. Чтобы упростить структурирование, используйте следующий обзор, который показывает, сколько кодовых точек помещается в цепочку байтов и чью структуру можно ожидать в диапазоне значений Unicode.

Размер в байтах Определение свободных битов Первая кодовая точка Юникода Последняя кодовая точка Юникода Стартовый байт / Байт 1 Байт последовательности 2 Байт последовательности 3 Байт последовательности 4
1 7 U+0000 U+007F 0xxxxxx      
2 11 U+0080 U+07FF 110xxxxx 10xxxxx    
3 16 U+0800 U+FFFF 1110xxxx 10xxxxxx 10xxxxxx  
4 21 U+10000 U+10FFFF 11110xxx 10xxxxx 10xxxxxx 10xxxxxx

В пределах диапазона кодов можно предположить количество используемых байт, поскольку при нумерации кодовых точек Юникода и двоичных чисел UTF-8 соблюдается лексический порядок. В диапазоне U+0800 и U+FFFF UTF-8 используется 3 байта. Для выражения кодовой точки символа доступно 16 бит. Вычисленное двоичное число располагается в схеме UTF-8 справа налево, заполняя все пробелы слева нулями.

Пример вычисления:

Символᅢ(Hangul Junseong, Ä) имеет кодовую точку Unicode вместо U+1162. Чтобы вычислить двоичное число, сначала преобразуйте шестнадцатеричное число в десятичное. Каждая цифра в числе соответствует соответствующей степени 16, причем правая цифра имеет наименьшее значение 160 = 1. Начиная справа, умножьте числовое значение цифры на ее мощность, а затем сложите полученные результаты.

2 * 1 = 2
6 * 16 = 96
1 * 256 = 256
1 * 4096 = 4096
4450 4450 4450 4450 4450

4450 — это вычисленное десятичное число. Теперь преобразуйте его в двоичное число. Для этого разделите число на 2, пока в результате не получится 0. Остаток — это двоичное число, записанное справа налево.

4450 : 2 = 2225 Остаток:  
2225 : 2 = 1112 Отдых: 1
1112 : 2 = 556 Отдых:  
556 : 2 = 278 Отдых:  
278 : 2 = 139 Отдых:  
139 : 2 = 69 Отдых: 1
69 : 2 = 34 Отдых: 1
34 : 2 = 17 Отдых:  
17 : 2 = 8 Отдых: 1
8 : 2 = 4 Отдых:  
4 : 2 = 2 Отдых:  
2 : 2 = 1 Отдых:  
1 : 2 =   Отдых: 1
Результат: 1000101100010 Результат: 1000101100010 Результат: 1000101100010 Результат: 1000101100010 Результат: 1000101100010 Результат: 1000101100010
шестнадцатеричная система двоичный
   
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
8 1000
9 1001
A 1010
B 1011
C 1100
D 1101
E 1110
F 1111

В этом подробном примере вы можете точно следовать шагам вычислений. Если вы хотите быстро и легко преобразовать шестнадцатеричные числа в двоичные, просто замените каждую шестнадцатеричную цифру на соответствующие четыре двоичные цифры.

Для точки Юникода U+1162 соедините цифры следующим образом:

x1 = b0001

x1 = b0001

x6 = b0110

x2 = b0010

x1162 = b000100010101100010

Код UTF-8 предписывает 3 байта для кодовой точки U+1162, поскольку она находится между U+0800 и U+FFFF. Байт начинается с 1110, два следующих байта начинаются с 10, а двоичное число добавляется справа налево в свободные биты, которые не задают структуру. Добавляйте 0 к другим битам в стартовом байте, пока октет не будет заполнен. Кодировка UTF-8 выглядит следующим образом:

11100001 10000101 10100010 (вставленная кодовая точка выделена жирным шрифтом).

Символы Кодовая точка Юникода, шестнадцатеричное число Десятичное число Двоичное число UTF-8
U+1162 4450 1000101100010 11100001 10000101 10100010

UTF-8 в редакторах

UTF-8 — самый распространенный стандарт в интернете, но простые текстовые редакторы не всегда сохраняют тексты в этом формате по умолчанию. Например, по умолчанию Microsoft Notepad использует кодировку «ANSI» Если вы хотите преобразовать текстовый файл из Microsoft Word в UTF-8 (например, для сопоставления различных систем письма), выполните следующие действия: Перейдите в раздел «Сохранить как» и выберите опцию «Только текст» в разделе «Тип файла».

Откроется всплывающее окно «Преобразование файла». В разделе «Кодировка текста» выберите «Другая кодировка», а затем «Юникод (UTF-8)» из списка. В раскрывающемся меню «End lines with» выберите «Carriage return/cell feed» или «CR/LF». Преобразовать файл в набор символов Юникода с помощью UTF-8 очень просто.

Если вы откроете непроверенный файл и не будете знать, какую кодировку он содержит, то во время редактирования могут возникнуть проблемы. В Unicode в таких случаях используется «Знак порядка байтов (BOM)». Этот невидимый символ указывает, в каком формате находится документ — с большим или меньшим порядком следования. Если программа декодирует файл в формате UTF-16 little-endian, используя UTF-16 big-endian, текст будет выведен неправильно. Документы, основанные на наборе символов UTF-8, не имеют этой проблемы, поскольку порядок байтов всегда читается как big-endian последовательность байтов. В этом случае BOM просто показывает, что данный документ закодирован в UTF-8.

Примечание

Символы, представленные более чем одним байтом, в некоторых кодировках (UTF-16 и UTF-32) могут иметь старший байт в передней (левой) или задней (правой) позиции. Если старший байт («Most Significant Byte», MSB) находится впереди, кодировка получает дополнение «big-endian», если же MSB находится сзади, добавляется «little-endian».

Вы можете поместить BOM перед потоком данных или в начале файла. Выбор имеет приоритет над всеми другими утверждениями, включая заголовок HTTP. BOM служит своего рода подписью для кодировок Unicode и имеет кодовую точку U+FEFF. В зависимости от того, какая кодировка используется, BOM отображается по-разному в кодированном виде.

Формат кодирования BOM, кодовая точка: U+FEFF (hex.)
UTF-8 EF BB BF
UTF-16 big-endian FE FF
UTF-16 little-endian FF FE
UTF-32 big-endian 00 00 FE FF
UTF-32 little-endian FF FE 00 00

Вы не используете BOM, если протокол явно запрещает это, или если ваши данные уже отнесены к определенному типу. Некоторые программы в зависимости от протокола ожидают символов ASCII. Поскольку UTF-8 обратно совместим с кодировкой ASCII, и его порядок байтов фиксирован, вам не нужен BOM. Фактически, Unicode рекомендует не использовать BOM в UTF-8. Однако, поскольку BOM может встречаться в старом коде и вызывать проблемы, важно идентифицировать BOM как таковой.

Заключение: Кодировка UTF-8 улучшает международное общение

У UTF-8 много преимуществ — не только то, что эта кодировка обратно совместима с ASCII. Благодаря переменной длине последовательности байтов и огромному количеству возможных кодовых точек, она может представлять чрезвычайно большое количество различных систем письма. Место для хранения данных используется эффективно.

Введение единых стандартов, таких как Unicode, облегчает международное общение. Благодаря использованию самосинхронизирующихся последовательностей байтов, кодировка UTF-8 характеризуется низким уровнем ошибок при представлении символов. Даже если произойдет ошибка кодирования или передачи, можно найти начало каждого символа, просто определив байт в последовательности, начинающийся с 0 или 11. UTF-8 стал неоспоримым стандартом кодирования для веб-сайтов с коэффициентом использования более 90 процентов.

Оцените статью
cdelat.ru
Добавить комментарий