Что такое кодировка utf 8: Кодирование и декодирование / Хабр

Содержание

Кодирование и декодирование / Хабр

Причиной разобраться в том, как же работает UTF-8 и что такое Юникод заставил тот факт, что VBScript не имеет встроенных функций работы с UTF-8. А так как ничего рабочего не нашел, то пришлось писть/дописывать самому. Опыт на мой взгляд полезный в любом случае. Для лучшего понимания начну с теории.

О Юникоде

До появления Юникода широко использовались 8-битные кодировки, главные минусы которых очевидны:


  • Всего 255 символов, да и то часть из них не графические;
  • Возможность открыть документ не с той кодировкой, в которой он был создан;
  • Шрифты необходимо создавать для каждой кодировки.

Так и было решено создать единый стандарт «широкой» кодировки, которая включала бы все символы (при чем сначала хотели в нее включить только обычные символы, но потом передумали и начали добавлять и экзотические). Юникод использует 1 112 064 кодовых позиций (больше чем 16 бит). Начало дублирует ASCII, а дальше остаток латиницы, кирилица, другие европейские и азиатские символы. Для обозначений символов используют шестнадцатеричную запись вида «U+xxxx» для первых 65k и с большим количеством цифр для остальных.

О UTF-8

Когда-то я думал что есть Юникод, а есть UTF-8. Позже я узнал, что ошибался.

UTF-8 является лишь представлением Юникода в 8-битном виде. Символы с кодами меньше 128 представляются одним байтом, а так как в Юникоде они повторяют ASCII, то текст написанный только этими символами будет являться текстом в ASCII. Символы же с кодами от 128 кодируются 2-мя байтами, с кодами от 2048 — 3-мя, от 65536 — 4-мя. Так можно было бы и до 6-ти байт дойти, но кодировать ими уже ничего.

0x00000000 — 0x0000007F: 0xxxxxxx
0x00000080 — 0x000007FF: 110xxxxx 10xxxxxx
0x00000800 — 0x0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx
0x00010000 — 0x001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

Кодируем в UTF-8

Порядок действий примерно такой:


  • Каждый символ превращаем в Юникод.
  • Проверяем из какого символ диапазона.
  • Если код символа меньше 128, то к результату добавляем его в неизменном виде.
  • Если код символа меньше 2048, то берем последние 6 бит и первые 5 бит кода символа. К первым 5 битам добавляем 0xC0 и получаем первый байт последовательности, а к последним 6 битам добавляем 0x80 и получаем второй байт. Конкатенируем и добавляем к результату.
  • Похожим образом можем продолжить и для больших кодов, но если символ за пределами U+FFFF придется иметь дело с UTF-16 суррогатами.
Function EncodeUTF8(s)
    Dim i, c, utfc, b1, b2, b3
    
    For i=1 to Len(s)
        c = ToLong(AscW(Mid(s,i,1)))
 
        If c < 128 Then
            utfc = chr( c)
        ElseIf c < 2048 Then
            b1 = c Mod &h50
            b2 = (c - b1) / &h50
            utfc = chr(&hC0 + b2) & chr(&h80 + b1)
        ElseIf c < 65536 And (c < 55296 Or c > 57343) Then
            b1 = c Mod &h50
            b2 = ((c - b1) / &h50) Mod &h50
            b3 = (c - b1 - (&h50 * b2)) / &h2000
            utfc = chr(&hE0 + b3) & chr(&h80 + b2) & chr(&h80 + b1)
        Else
            ' Младший или старший суррогат UTF-16
            utfc = Chr(&hEF) & Chr(&hBF) & Chr(&hBD)
        End If

        EncodeUTF8 = EncodeUTF8 + utfc
    Next
End Function

Function ToLong(intVal)
    If intVal < 0 Then
        ToLong = CLng(intVal) + &h20000
    Else
        ToLong = CLng(intVal)
    End If
End Function

Декодируем UTF-8


  • Ищем первый символ вида 11xxxxxx
  • Считаем все последующие байты вида 10xxxxxx
  • Если последовательность из двух байт и первый байт вида 110xxxxx, то отсекаем приставки и складываем, умножив первый байт на 0x40.
  • Аналогично для более длинных последовательностей.
  • Заменяем всю последовательность на нужный символ Юникода.
Function DecodeUTF8(s)
    Dim i, c, n, b1, b2, b3

    i = 1
    Do While i <= len(s)
        c = asc(mid(s,i,1))
        If (c and &hC0) = &hC0 Then
            n = 1
            Do While i + n <= len(s)
                If (asc(mid(s,i+n,1)) and &hC0) <> &h80 Then
                    Exit Do
                End If
                n = n + 1
            Loop
            If n = 2 and ((c and &hE0) = &hC0) Then
                b1 = asc(mid(s,i+1,1)) and &h4F
                b2 = c and &h2F
                c = b1 + b2 * &h50
            Elseif n = 3 and ((c and &hF0) = &hE0) Then
                b1 = asc(mid(s,i+2,1)) and &h4F
                b2 = asc(mid(s,i+1,1)) and &h4F
                b3 = c and &h0F
                c = b3 * &h2000 + b2 * &h50 + b1
            Else
                ' Символ больше U+FFFF или неправильная последовательность
                c = &hFFFD
            End if
            s = left(s,i-1) + chrw( c) + mid(s,i+n)
        Elseif (c and &hC0) = &h80 then
            ' Неожидаемый продолжающий байт
            s = left(s,i-1) + chrw(&hFFFD) + mid(s,i+1)
        End If
        i = i + 1
    Loop
    DecodeUTF8 = s 
End Function

Ссылки


Юникод на Википедии
Исходник для ASP+VBScript

UPD: Обработка ошибочных последовательностей и ошибка с типом Integer, который возвращает AscW.

полезная информация и краткая ретроспектива

  • Главная
  • ->
  • Материалы
  • ->
  • Кодировки: полезная информация и краткая ретроспектива

Reg.ru: домены и хостинг

Крупнейший регистратор и хостинг-провайдер в России.

Более 2 миллионов доменных имен на обслуживании.

Продвижение, почта для домена, решения для бизнеса.

Более 700 тыс. клиентов по всему миру уже сделали свой выбор.

Перейти на сайт->

Бесплатный Курс «Практика HTML5 и CSS3»

Освойте бесплатно пошаговый видеокурс

по основам адаптивной верстки

на HTML5 и CSS3 с полного нуля.

Начать->

Фреймворк Bootstrap: быстрая адаптивная вёрстка

Пошаговый видеокурс по основам адаптивной верстки в фреймворке Bootstrap.

Научитесь верстать просто, быстро и качественно, используя мощный и практичный инструмент.

Верстайте на заказ и получайте деньги.

Получить в подарок->

Бесплатный курс «Сайт на WordPress»

Хотите освоить CMS WordPress?

Получите уроки по дизайну и верстке сайта на WordPress.

Научитесь работать с темами и нарезать макет.

Бесплатный видеокурс по рисованию дизайна сайта, его верстке и установке на CMS WordPress!

Получить в подарок->

*Наведите курсор мыши для приостановки прокрутки.

Назад Вперед


Кодировки: полезная информация и краткая ретроспектива

Данную статью я решил написать как небольшой обзор, касающийся вопроса кодировок.

Мы разберемся, что такое вообще кодировка и немного коснемся истории того, как они появились в принципе.

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

Итак, поехали…

Что такое кодировка?

Упрощенно говоря, кодировка — это таблица сопоставлений символов, которые мы можем видеть на экране, определенным числовым кодам.

Т.е. каждый символ, который мы вводим с клавиатуры, либо видим на экране монитора, закодирован определенной последовательностью битов (нулей и единиц). 8 бит, как вы, наверное, знаете, равны 1 байту информации, но об этом чуть позже.

Внешний вид самих символов определяется файлами шрифтов, которые установлены на вашем компьютере. Поэтому процесс вывода на экран текста можно описать как постоянное сопоставление последовательностей нулей и единиц каким-то конкретным символам, входящим в состав шрифта.

Прародителем всех современных кодировок можно считать ASCII.

Эта аббревиатура расшифровывается как American Standard Code for Information Interchange (американская стандартная кодировочная таблица для печатных символов и некоторых специальных кодов).

Это однобайтовая кодировка, в которую изначально заложено всего 128 символов: буквы латинского алфавита, арабские цифры и т.д.

Позже она была расширена (изначально она не использовала все 8 бит), поэтому появилась возможность использовать уже не 128, а 256 (2 в 8 степени) различных символов, которые можно закодировать в одном байте информации.

Такое усовершенствование позволило добавлять в ASCII символы национальных языков, помимо уже существующей латиницы.

Вариантов расширенной кодировки ASCII существует очень много по причине того, что языков в мире тоже немало. Думаю, что многие из вас слышали о такой кодировке, как KOI8-R — это тоже расширенная кодировка ASCII, предназначенная для работы с символами русского языка.

Следующим шагом в развитии кодировок можно считать появление так называемых ANSI-кодировок.

По сути это были те же расширенные версии ASCII, однако из них были удалены различные псевдографические элементы и добавлены символы типографики, для которых ранее не хватало «свободных мест».

Примером такой ANSI-кодировки является всем известная Windows-1251. Помимо типографических символов, в эту кодировку также были включены буквы алфавитов языков, близких к русскому (украинский, белорусский, сербский, македонский и болгарский).

ANSI-кодировка — это собирательное название. В действительности, реальная кодировка при использовании ANSI будет определяться тем, что указано в реестре вашей операционной системы Windows. В случае с русским языком это будет Windows-1251, однако, для других языков это будет другая разновидность ANSI.

Как вы понимаете, куча кодировок и отсутствие единого стандарта до добра не довели, что и стало причиной частых встреч с так называемыми кракозябрами — нечитаемым бессмысленным набором символов.

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

.

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

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

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

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

Юникод — универсальная кодировка текста (UTF-32, UTF-16 и UTF-8)

Сам стандарт был предложен в 1991 году некоммерческой организацией «Консорциум Юникода» (Unicode Consortium, Unicode Inc.), и первым результатом его работы стало создание кодировки UTF-32.

Кстати, сама аббревиатура UTF расшифровывается как Unicode Transformation Format (Формат Преобразования Юникод).

В этой кодировке для кодирования одного символа предполагалось использовать аж 32 бита, т.е. 4 байта информации. Если сравнивать это число с однобайтовыми кодировками, то мы придем к простому выводу: для кодирования 1 символа в этой универсальной кодировке нужно в 4 раза больше битов, что «утяжеляет» файл в 4 раза.

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

На смену ей пришла новая разработка — UTF-16.

Как очевидно из названия, в этой кодировке один символ кодируют уже не 32 бита, а только 16 (т.е. 2 байта). Очевидно, это делает любой символ вдвое «легче», чем в UTF-32, однако и вдвое «тяжелее» любого символа, закодированного с помощью однобайтовой кодировки.

Количество символов, доступное для кодирования в UTF-16 равно, как минимум, 2 в 16 степени, т.е. 65536 символов. Вроде бы все неплохо, к тому же окончательная величина кодового пространства в UTF-16 была расширена до более, чем 1 миллиона символов.

Однако и данная кодировка до конца не удовлетворяла потребности разработчиков. Скажем, если вы пишете, используя исключительно латинские символы, то после перехода с расширенной версии кодировки ASCII к UTF-16 вес каждого файла увеличивался вдвое.

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

UTF-8 — это многобайтовая кодировка с переменной длинной символа. Глядя на название, можно по аналогии с UTF-32 и UTF-16 подумать, что здесь для кодирования одного символа используется 8 бит, однако это не так. Точнее, не совсем так.

Дело в том, что UTF-8 обеспечивает наилучшую совместимость со старыми системами, использовавшими 8-битные символы. Для кодирования одного символа в UTF-8 реально используется от 1 до 4 байт (гипотетически можно и до 6 байт).

В UTF-8 все латинские символы кодируются 8 битами, как и в кодировке ASCII. Иными словами, базовая часть кодировки ASCII (128 символов) перешла в UTF-8, что позволяет «тратить» на их представление всего 1 байт, сохраняя при этом универсальность кодировки, ради которой все и затевалось.

Итак, если первые 128 символов кодируются 1 байтом, то все остальные символы кодируются уже 2 байтами и более. В частности, каждый символ кириллицы кодируется именно 2 байтами.

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

C BOM или без BOM?

Если вы работали с текстовыми редакторами (редакторами кода), например Notepad++, phpDesigner, rapid PHP и т.д., то, вероятно, обращали внимание на то, что при задании кодировки, в которой будет создана страница, можно выбрать, как правило, 3 варианта:

— ANSI
— UTF-8
— UTF-8 без BOM

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

Итак, что же такое BOM и почему нам это не нужно?

BOM расшифровывается как Byte Order Mark. Это специальный Unicode-символ, используемый для индикации порядка байтов текстового файла. По спецификации его использование не является обязательным, однако если BOM используется, то он должен быть установлен в начале текстового файла.

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

Поэтому, при работе с UTF-8 используйте именно вариант «UTF-8 без BOM». Также лучше не используйте редакторы, в которых в принципе нельзя указать кодировку (скажем, Блокнот из стандартных программ в Windows).

Кодировка текущего файла, открытого в редакторе кода, как правило, указывается в нижней части окна.

Обратите внимание, что запись «ANSI as UTF-8» в редакторе Notepad++ означает то же самое, что и «UTF-8 без BOM». Это одно и то же.



В программе phpDesigner нельзя сразу точно сказать, используется BOM, или нет. Для этого нужно кликнуть правой кнопкой мыши по надписи «UTF-8», после чего во всплывающем окне можно увидеть, используется ли BOM (опция Save with BOM).


В редакторе rapid PHP кодировка UTF-8 без BOM обозначается как «UTF-8*».

Как вы понимаете, в разных редакторах все выглядит немного по-разному, однако главную идею вы поняли.

После того, как документ сохранен в UTF-8 без BOM, нужно также убедиться, что верная кодировка указана в специальном метатэге в секции head вашего html-документа:



<meta charset = "utf-8" />


Соблюдение этих простых правил уже позволит вам избежать многих пробелем с кодировками.

На этом все, надеюсь, что данный небольшой экскурс и пояснения помогли вам лучше понять, что такое кодировки, какие они бывают и как работают.

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

Дмитрий Науменко.

P.S. Присмотритесь к премиум-урокам по различным аспектам сайтостроения, а также к бесплатному курсу по созданию своей CMS-системы на PHP с нуля. Все это поможет вам быстрее и проще освоить различные технологии веб-разработки.

Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!


Смотрите также:

Наверх

Что такое кодировка UTF-8? Руководство для непрограммистов

Текст: его важность в Интернете само собой разумеется. Это первая буква «Т» в «HTTP», единственная буква «Т» в «HTML», и практически каждый веб-сайт каким-то образом использует ее, будь то URL-адрес, рекламный текст, обзор продукта, вирусный твит или Сообщение блога. (Всем привет!)

Но веб-текст на самом деле может быть не таким простым, как вы думаете. Рассмотрим тысячи языков, на которых сегодня говорят, или все знаки препинания и символы, которые мы можем добавить, чтобы улучшить их, или тот факт, что создаются новые смайлики, чтобы уловить каждую человеческую эмоцию. Как веб-сайты все это хранят и обрабатывают?

По правде говоря, даже такая простая вещь, как текст, требует хорошо скоординированной, четко определенной системы для отображения в веб-браузерах. В этом посте я объясню основы одной технологии, которая имеет ключевое значение для текста в Интернете, UTF-8. Мы изучим основы хранения и кодирования текста и обсудим, как это помогает размещать привлекательные слова на вашем сайте.

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

Что такое UTF-8?

UTF-8 означает «Формат преобразования Unicode – 8 бит». Это пока не помогает нам, поэтому давайте вернемся к основам.

Двоичный: как компьютеры хранят информацию

Для хранения информации компьютеры используют двоичную систему. В двоичном формате все данные представлены в виде последовательностей единиц и нулей. Самая основная единица двоичного кода – это бит, который представляет собой всего лишь 1 или 0. Следующая по величине единица двоичного кода, байт, состоит из 8 бит. Пример байта – «01101011».

Каждый цифровой актив, с которым вы когда-либо сталкивались – от программного обеспечения до мобильных приложений, от веб-сайтов до историй в Instagram – построен на этой системе байтов, которые связаны друг с другом таким образом, что это имеет смысл для компьютеров. Когда мы говорим о размерах файлов, мы имеем в виду количество байтов. Например, килобайт – это примерно тысяча байт, а гигабайт – примерно миллиард байтов.

Текст – это один из многих ресурсов, которые компьютеры хранят и обрабатывают. Текст состоит из отдельных символов, каждый из которых представлен в компьютерах строкой битов. Эти строки собираются в цифровые слова, предложения, абзацы, любовные романы и т.д.

ASCII: преобразование символов в двоичные

Американский стандартный код обмена информацией (ASCII) был ранней стандартизированной системой кодирования текста. Кодирование – это процесс преобразования символов человеческих языков в двоичные последовательности, которые могут обрабатывать компьютеры.

Библиотека ASCII включает все буквы в верхнем и нижнем регистре латинского алфавита (A, B, C…), каждую цифру от 0 до 9 и некоторые общие символы (например, /,! И?). Он присваивает каждому из этих символов уникальный трехзначный код и уникальный байт.

В таблице ниже показаны примеры символов ASCII с соответствующими кодами и байтами.

символКод ASCIIБАЙТ
А06501000001
а09701100001
B06601000010
б09801100010
С УЧАСТИЕМ09001011010
с участием12201111010
004800110000
905700111001
!03300100001
?06300111111

Подобно тому, как символы объединяются в слова и предложения в языке, двоичный код делает это в текстовых файлах. Итак, фраза «Быстрая коричневая лисица перепрыгивает через ленивого пса». в двоичном формате ASCII будет:

01010100 01101000 01100101 00100000 01110001
01110101 01101001 01100011 01101011 00100000
01100010 01110010 01101111 01110111 01101110
00100000 01100110 01101111 01111000 00100000
01101010 01110101 01101101 01110000 01110011
00100000 01101111 01110110 01100101 01110010
00100000 01110100 01101000 01100101 00100000
01101100 01100001 01111010 01111001 00100000
01100100 01101111 01100111 00101110

Это мало что значит для нас, людей, но это хлеб с маслом для компьютера.

Количество символов, которые может представлять ASCII, ограничено количеством доступных уникальных байтов, поскольку каждый символ получает один байт. Если вы посчитаете, то обнаружите, что существует 256 различных способов группировки восьми единиц и нулей вместе. Это дает нам 256 различных байтов или 256 способов представления символа в ASCII. Когда в 1960 году был представлен ASCII, это было нормально, поскольку разработчикам требовалось всего 128 байт для представления всех необходимых им английских символов и символов.

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

Юникод: способ хранить каждый символ, когда-либо

Используйте Unicode, систему кодирования, которая решает проблему пространства ASCII. Как и ASCII, Unicode присваивает каждому символу уникальный код, называемый кодовой точкой. Однако более сложная система Unicode может генерировать более миллиона кодовых точек, чего более чем достаточно для учета каждого символа на любом языке.

Юникод теперь является универсальным стандартом для кодирования всех человеческих языков. И да, он даже включает смайлы.

Ниже приведены несколько примеров текстовых символов и соответствующих им кодовых точек. Каждая кодовая точка начинается с буквы «U» для «Unicode», за которой следует уникальная строка символов для представления символа.

символКодовая точка
АU+0041
аU+0061
0U+0030
9U+0039
!U+0021
ОСТРОВU + 00D8
ڃU+0683
ChU + 0C9A
𠜎U+2070E
😁U+1F601

Если вы хотите узнать, как генерируются кодовые точки и что они означают в Unicode, ознакомьтесь с этим подробным объяснением.

Итак, теперь у нас есть стандартизированный способ представления каждого символа, используемого каждым человеческим языком, в единой библиотеке. Это решает проблему нескольких систем маркировки для разных языков – любой компьютер на Земле может использовать Unicode.

Но один только Unicode не хранит слова в двоичном формате. Компьютерам нужен способ перевода Unicode в двоичный код, чтобы его символы можно было хранить в текстовых файлах. Вот где пригодится UTF-8.

UTF-8: последний кусок головоломки

UTF-8 – это система кодирования Unicode. Он может преобразовывать любой символ Юникода в соответствующую уникальную двоичную строку, а также может преобразовывать двоичную строку обратно в символ Юникода. Это значение «UTF» или «Формат преобразования Unicode».

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

Более конкретно, UTF-8 преобразует кодовую точку (которая представляет один символ в Unicode) в набор от одного до четырех байтов. Первые 256 символов в библиотеке Unicode, включая символы, которые мы видели в ASCII, представлены как один байт. Символы, которые появляются позже в библиотеке Unicode, кодируются как двухбайтовые, трехбайтовые и, возможно, четырехбайтовые двоичные единицы.

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

символКодовая точкаДвоичная кодировка UTF-8
АU+004101000001
аU+006101100001
0U+003000110000
9U+003900111001
!U+002100100001
ОСТРОВU + 00D811000011 10011000
ڃU+068311011010 10000011
ChU + 0C9A11100000 10110010 10011010
𠜎U+2070E11110000 10100000 10011100 10001110
😁U+1F60111110000 10011111 10011000 10000001

Почему UTF-8 преобразовывает одни символы в один байт, а другие – в четыре байта? Короче для экономии памяти. Используя меньше места для представления более общих символов (например, символов ASCII), UTF-8 уменьшает размер файла, позволяя использовать гораздо большее количество менее распространенных символов. Эти менее распространенные символы кодируются в два или более байта, но это нормально, если они хранятся экономно.

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

Еще одно преимущество кодировки UTF-8 – обратная совместимость с ASCII. Первые 128 символов в библиотеке Unicode соответствуют символам в библиотеке ASCII, и UTF-8 переводит эти 128 символов Unicode в те же двоичные строки, что и ASCII. В результате UTF-8 может без проблем преобразовывать текстовый файл, отформатированный в ASCII, в читаемый человеком текст.

Символы UTF-8 в веб-разработке

UTF-8 – наиболее распространенный метод кодирования символов, используемый сегодня в Интернете, и набор символов по умолчанию для HTML5. Таким образом хранятся персонажи более 95% всех веб-сайтов, в том числе и ваш собственный. Кроме того, распространенные методы передачи данных через Интернет, такие как XML и JSON, кодируются стандартами UTF-8.

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

Текстовые файлы, закодированные с помощью UTF-8, должны указывать на это программному обеспечению, обрабатывающему их. В противном случае программа не сможет должным образом преобразовать двоичный код обратно в символы. В файлах HTML вы можете увидеть строку кода, подобную следующей, вверху:

Это сообщает браузеру, что файл HTML закодирован в UTF-8, чтобы браузер мог преобразовать его обратно в разборчивый текст.

UTF-8 против UTF-16

Как я уже упоминал, UTF-8 – не единственный метод кодирования символов Unicode – существует также UTF-16. Эти методы различаются количеством байтов, необходимых для хранения символа. UTF-8 кодирует символ в двоичную строку из одного, двух, трех или четырех байтов. UTF-16 кодирует символ Unicode в строку из двух или четырех байтов.

Это различие видно из их названий. В UTF-8 наименьшее двоичное представление символа составляет один байт или восемь битов. В UTF-16 наименьшее двоичное представление символа составляет два байта или шестнадцать бит.

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

символДвоичная кодировка UTF-8Двоичная кодировка UTF-16
А0100000101000001 11011000 00001110 11011111
𠜎11110000 10100000 10011100 1000111001000001 11011000 00001110 11011111

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

UTF-16 более эффективен, чем UTF-8, только на некоторых неанглоязычных сайтах. Если веб-сайт использует язык с символами, находящимися дальше в библиотеке Unicode, UTF-8 будет кодировать все символы как четыре байта, тогда как UTF-16 может кодировать многие из тех же символов только как два байта. Тем не менее, если ваши страницы заполнены буквами ABC и 123, придерживайтесь UTF-8.

Расшифровка мира кодировки UTF-8

Это было много слов о словах, поэтому давайте резюмируем то, что мы рассмотрели:

  1. Компьютеры хранят данные, включая текстовые символы, как двоичные (единицы и нули).
  2. ASCII был ранним способом кодирования или отображения символов в двоичный код, чтобы компьютеры могли их хранить. Однако в ASCII не было достаточно места для представления нелатинских символов и чисел в двоичном формате.
  3. Юникод был решением этой проблемы. Юникод присваивает уникальный «код» каждому символу на каждом человеческом языке.
  4. UTF-8 – это метод кодировки символов Unicode. Это означает, что UTF-8 берет кодовую точку для данного символа Юникода и переводит ее в строку двоичного кода. Он также делает обратное, считывая двоичные цифры и преобразуя их обратно в символы.
  5. UTF-8 в настоящее время является самым популярным методом кодирования в Интернете, поскольку он может эффективно хранить текст, содержащий любой символ.
  6. UTF-16 – еще один метод кодирования, но он менее эффективен для хранения текстовых файлов (за исключением тех, которые написаны на некоторых неанглийских языках).

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

Но если вы обнаружите, что страницы вашего веб-сайта занимают чрезмерно много места или если ваш текст завален буквами and и, пора применить ваши новые знания о UTF-8.

Источник записи: https://blog.hubspot.com

Кодировка HTML страницы и атрибуты — Знакомство с HTML — codebra

Дополнительное видео по теме

Как добавить кодировку страницы?

Вы когда-нибудь видели на странице в интернете какие-то знаки вопроса, квадратики и прочее вместо текста? Думаю, что видели. Так вот, у этого сайта проблема с кодировкой, вполне возможно разработчик ее не указал. Кодировка, простыми словами, это таблица содержащая набор символов. Для того чтобы добавить кодировку сайта, нужен многофункциональный тег <meta> , о нем написан целый урок. Итак, чтобы браузер понял, какую кодировку вы используете, применяйте эту строку:

Код HTML

<meta charset = "utf-8">

Что такое кодировка?

Кодировка, это набор символов, представленный в таблице. Таблица содержит сам символ и его код, например, двоичный (нули и единицы). Термин «набор символов» редко используется, чаще всего говорят «кодировка». На данный момент популярны две кодировки: ASCII и UTF-8. На нашем сайте используется кодировка UTF-8.

Подробнее о кодировке?

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

В UTF-8 коды от 0 до 127 используются для представления символов ASCII. Если символ не входит в набор ASCII, то старший бит первого байта устанавливается в 1, что свидетельствует о дополнительном использовании байтов. То есть если в документе используются только символы из ASCII, то каждый символ в UTF-8 будет кодироваться восьмью битами.

Что такое атрибуты?

Настало время познакомиться с атрибутами в HTML. Вы их уже встречали, просто на них не акцентировалось внимание. Атрибуты – это дополнение к тегам, расширяющее их возможности. Они всегда указываются в открывающемся теге. Атрибут состоит из имени и значения, разделенного знаком равенства.

Имя атрибута необходимо писать в нижнем регистре. Хотя HTML5 и позволяет писать в любом регистре и не использовать кавычки, все же так не рекомендуется делать.

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

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

В (не слишком) ранние дни все, что существовало, было 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, поэтому я просто приведу несколько примеров ссылок:

Другие:

man UTF-8 (7): ASCII-совместимая многобайтная юникодная кодировка

UTF-8(7) ASCII-совместимая многобайтная юникодная кодировка

ОПИСАНИЕ

Набор символов Unicode 3.0 занимает 16-битное кодовое пространство. Наиболее распространённая юникодная кодировка, известная как UCS-2, содержит последовательности 16-битных слов. Закодированные таким образом строки могут состоять из частей 16-битных символов например, ‘\0’ или ‘/’, которые имеют специальное значение в именах файлов и других параметрах функций библиотеки языка Си. Кроме того, большинство утилит UNIX предназначено для обработки ASCII-файлов и не может воспринимать 16-битные слова как символы. По этим причинам UCS-2 является неподходящей кодировкой Юникода для имён файлов, текстовых файлов, переменных окружения и т.д. Набор ISO Universal Character Set (UCS), расширенный набор Юникода, занимает более 31-битного кодового пространства, а используемая для него кодировка UCS-4 (последовательность 32-битных слов) имеет те же недостатки, что и описанные выше.

Кодировка UTF-8 для представления Юникода и UCS лишена этих недостатков и поэтому в UNIX-подобных операционных системах используется наиболее часто.

Свойства

Кодировка UTF-8 обладает следующими полезными свойствами:
*
UCS-символы с кодами от 0x00000000 до 0x0000007f (стандартный набор US-ASCII) кодируются как байты с кодами от 0x00 до 0x7f (для совместимости с кодовой таблицей ASCII). Это означает, что файлы и строки, содержащие только 7-битные ASCII-символы, будут иметь одинаковое представление как в ASCII так и в UTF-8.31 значения UCS.
*
В кодировке UTF-8 никогда не используются байты с кодами 0xc0, 0xc1, 0xfe и 0xff.
*
Первый байт многобайтовой последовательности, представляющей один не ASCII UCS-символ, всегда находится в диапазоне от 0xc2 до 0xfd и указывает на длину мульбайтовой последовательности. Все последующие байты в многобайтовой последовательности находятся в диапазоне от 0x80 до 0xbf. Это позволяет облегчить ресинхронизацию, устраняет необходимость учитывать состояние кодировки (statelessness) и делает кодировку независимой от пропущенных байтов.
*
Символы UCS, закодированные в UTF-8, могут занимать до шести байтов, однако в стандарте Юникода не определены символы выше 0x10ffff, поэтому в UTF-8 юникодные символы могут иметь максимальный размер 4 байта.

Кодирование

Приведённые ниже последовательности байтов используются для отображения символа. Конкретная последовательность зависит от номера символа в кодировке UCS:
0x00000000 — 0x0000007F:
0xxxxxxx
0x00000080 — 0x000007FF:
110xxxxx 10xxxxxx
0x00000800 — 0x0000FFFF:
1110xxxx 10xxxxxx 10xxxxxx
0x00010000 — 0x001FFFFF:
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
0x00200000 — 0x03FFFFFF:
111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx
0x04000000 — 0x7FFFFFFF:
1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

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

Значения кодов UCS 0xd00-0xdfff (суррогаты UTF-16), а также 0xfffe и 0xffff (несимвольные значения UCS), не должны появляться в потоках UTF-8.

Пример

Символ Юникода с кодом 0xa9 = 1010 1001 (знак авторского права) кодируется в UTF-8 как
11000010 10101001 = 0xc2 0xa9

а символ с кодом 0x2260 = 0010 0010 0110 0000 (знак неравенства) кодируется так:

11100010 10001001 10100000 = 0xe2 0x89 0xa0

Замечания к применению

Для включения поддержки UTF-8 в приложениях, пользователи должны выбрать локаль UTF-8, например с помощью
export LANG=en_GB.UTF-8

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

setlocale(LC_CTYPE, «»)

и затем проверять выражением

strcmp(nl_langinfo(CODESET), «UTF-8») == 0

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

Программисты, привыкшие к однобайтовым кодировкам, таким как, US-ASCII или ISO 8859, должны учесть, что два предположения, действовавших ранее, в локалях UTF-8 не работают. Первое: один байт теперь не обязательно соответствует одному символу. Второе: современные эмуляторы терминала в режиме UTF-8 также поддерживают китайские, японские и корейские символы двойной ширины (double-width characters), а также комбинированные символы без пробелов, и вывод одного символа необязательно смещает курсор на одну позицию, как это было в ASCII. Для подсчёта количества символов и позиций курсора нужно использовать библиотечные функции, такие как mbsrtowcs(3) и wcswidth(3).

Стандартной ESC-последовательностью для переключения из схемы кодировки ISO 2022 (используется в терминалах VT100) в UTF-8 является ESC % G («\x1b%G»). Соответственно, обратной последовательностью для переключения из UTF-8 в ISO 2022 будет ESC % @ («\x1b%@»). Остальные последовательности ISO 2022 (такие, как переключение в наборы G0 и G1) в режиме UTF-8 не работают.

Безопасность

Стандарты Юникода и UCS требуют, чтобы генераторы UTF-8 использовали самую короткую возможную форму представления символов, то есть создание двухбайтной последовательности с первым байтом, равным 0xc0, запрещено. В стандарте Unicode 3.1 это правило расширено и запрещает программам воспринимать не самую короткую форму при вводе. Это сделано из соображений безопасности: если вводимые пользователем символы проверяются системой безопасности на возможные нарушения, то программам остаётся проверить только ASCII версии символов «/../», «;» или NUL, так как для этих символов может быть очень много не ASCII способов представления при не самом коротком кодировании в UTF-8.

Стандарты

ISO/IEC 10646-1:2000, Unicode 3.1, RFC 3629, Plan 9.

Мультиязычные формы

Мультиязычные формы

Intended audience: XHTML/HTML верстальщики, программисты (PHP, JSP, и т.д.), менеджеры веб-проектов, и любые другие, кто хочет узнать информацию по работе с кодировками в формах.

Какой наилучший способ работы с формами, включающими в себя несколько языков?

Наилучшим способом работы с особенностями кодировок в (X)HTML является хранение ваших страниц в UTF-8. Кодировка UTF-8 содержит большой набор символов из различных языков. Браузеры посылают данные из заполненных форм обратно на сервер в той-же кодировке, что и оригинальная страница. Поэтому пользователь может заполнить информацию на любом языке, который ему необходим.

Есть несколько пунктов которые надо проверить для того, чтобы убедиться в работоспособности данного метода у вас. Первым делом, надо указать браузеру что страница написана в UTF-8. Существует ряд способов указания кодировки страницы. Указание кодировки становится особенно важным, когда форма на странице не содержит национальных символов кроме стандартных латинских US-ASCII, но пользователи могут вводить таковые в форму.

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

Например, в Perl регулярное выражение, проверяющее кодировку пользователя, может выглядеть следующим образом:

$field =~
  /\A(
     [\x00-\x7F]            # ASCII
   | [\xC2-\xDF][\x80-\xBF]             # non-overlong 2-byte
   |  \xE0[\xA0-\xBF][\x80-\xBF]        # excluding overlongs
   | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # straight 3-byte
   |  \xED[\x80-\x9F][\x80-\xBF]        # excluding surrogates
   |  \xF0[\x90-\xBF][\x80-\xBF]{2}     # planes 1-3
   | [\xF1-\xF3][\x80-\xBF]{3}          # planes 4-15
   |  \xF4[\x80-\x8F][\x80-\xBF]{2}     # plane 16
  )*\z/x;

Эта конструкция может быть портирована под другие языки программирования. Она предусматривает обработку различных ошибок связанных с неверным формированием UTF-8. Функция вернет true если переменная $field в UTF-8, и false в противоположном случае.

The above regular expression can be tailored by adding application-related restrictions. As an example, many control characters can be excluded by replacing [\x00-\x7F] with [\x09\x0A\x0D\x20-\x7E]

Что такое кодировка UTF-8? Руководство для непрограммистов

Текст: его важность в Интернете само собой разумеется. Это первая буква «Т» в «HTTP», единственная буква «Т» в «HTML», и практически каждый веб-сайт так или иначе использует ее, будь то URL-адрес, часть маркетингового текста, обзор продукта, вирусный твит или Сообщение блога. (Привет!)

Но веб-текст на самом деле может быть не таким простым, как вы думаете. Рассмотрим тысячи языков, на которых сегодня говорят, или все знаки препинания и символы, которые мы можем добавить, чтобы улучшить их, или тот факт, что создаются новые смайлики, чтобы уловить каждую человеческую эмоцию.Как веб-сайты все это хранят и обрабатывают?

По правде говоря, даже такая простая вещь, как текст, требует хорошо скоординированной, четко определенной системы для отображения в веб-браузерах. В этом посте я объясню основы одной технологии, которая имеет ключевое значение для текста в Интернете, UTF-8 . Мы изучим основы хранения и кодирования текста и обсудим, как это помогает разместить на вашем сайте привлекательные слова.

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

Что такое UTF-8?

UTF-8 означает «Формат преобразования Unicode — 8 бит». Пока это нам не помогает, так что давайте вернемся к основам.

Двоичный: как компьютеры хранят информацию

Для хранения информации компьютеры используют двоичную систему. В двоичном формате все данные представлены последовательностями из единиц и нулей. Самая основная единица двоичного кода — это бит , который представляет собой всего лишь единицу 1 или 0. Следующая по величине единица двоичного кода, байт, состоит из 8 бит.Пример байта — «01101011».

Каждый цифровой актив, с которым вы когда-либо сталкивались, — от программного обеспечения до мобильных приложений, от веб-сайтов до историй в Instagram — построен на этой системе байтов, которые связаны друг с другом таким образом, чтобы это имело смысл для компьютеров. Когда мы говорим о размерах файлов, мы имеем в виду количество байтов. Например, килобайт — это примерно тысяча байт, а гигабайт — примерно миллиард байтов.

Текст — один из многих ресурсов, которые компьютеры хранят и обрабатывают.Текст состоит из отдельных символов, каждый из которых представлен в компьютерах строкой битов. Эти строки собираются в цифровые слова, предложения, абзацы, любовные романы и т. Д.

ASCII: преобразование символов в двоичные

Американский стандартный код обмена информацией (ASCII) был ранней стандартизированной системой кодирования текста. Кодирование — это процесс преобразования символов человеческих языков в двоичные последовательности, которые могут обрабатывать компьютеры.

Библиотека

ASCII включает в себя все прописные и строчные буквы латинского алфавита (A, B, C…), каждую цифру от 0 до 9 и некоторые общие символы (например, /,! И?). Он присваивает каждому из этих символов уникальный трехзначный код и уникальный байт.

В таблице ниже показаны примеры символов ASCII с соответствующими кодами и байтами.

Знак Код ASCII БАЙТ
А 065 01000001
a 097 01100001
B 066 01000010
б 098 01100010
Z 090 01011010
z 122 01111010
0 048 00110000
9 057 00111001
! 033 00100001
? 063 00111111

Подобно тому, как символы объединяются в слова и предложения на языке, двоичный код делает это в текстовых файлах.Итак, фраза «Быстрая коричневая лисица перепрыгивает через ленивого пса». в двоичном формате ASCII будет:

 
 

01010100 01101000 01100101 00100000 01110001

01110101 01101001 01100011 01101011 00100000

01100010 01110010 01101111 01110111 01101110

00100000 01100110 01101111 01111000 00100000

01101010 01110101 01101101 01110000 01110011

00100000 01101111 01110110 01100101 01110010

00100000 01110100 01101000 01100101 00100000

01101100 01100001 01111010 01111001 00100000

01100100 01101111 01100111 00101110

Это мало что значит для нас, людей, но это хлеб с маслом для компьютера.

Число символов, которые может представлять ASCII, ограничено числом доступных уникальных байтов, поскольку каждый символ получает один байт. Если вы посчитаете, то обнаружите, что существует 256 различных способов сгруппировать восемь единиц и нулей вместе. Это дает нам 256 различных байтов или 256 способов представления символа в ASCII. Когда в 1960 году был представлен ASCII, это было нормально, поскольку разработчикам требовалось всего 128 байт для представления всех необходимых им английских символов и символов.

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

Unicode: способ сохранить каждый символ, когда-либо

Введите Unicode, систему кодирования, которая решает проблему пространства ASCII. Как и ASCII, Unicode назначает уникальный код, называемый кодовой точкой , каждому символу. Однако более сложная система Unicode может генерировать более миллиона кодовых точек, чего более чем достаточно, чтобы учесть каждый символ на любом языке.

Unicode теперь является универсальным стандартом для кодирования всех человеческих языков. И да, он даже включает смайлики.

Ниже приведены несколько примеров текстовых символов и соответствующих им кодовых точек. Каждая кодовая точка начинается с буквы «U» для «Unicode», за которой следует уникальная строка символов для представления символа.

Знак Кодовая точка
А U + 0041
a U + 0061
0 U + 0030
9 U + 0039
! U + 0021
Ø U + 00D8
ڃ U + 0683
U + 0C9A
𠜎 U + 2070E
😁 U + 1F601

Если вы хотите узнать, как генерируются кодовые точки и что они означают в Unicode, ознакомьтесь с этим подробным объяснением.

Итак, теперь у нас есть стандартизированный способ представления каждого символа, используемого каждым человеческим языком, в одной библиотеке. Это решает проблему нескольких систем маркировки для разных языков — любой компьютер на Земле может использовать Unicode.

Но только Unicode не хранит слова в двоичном формате. Компьютерам нужен способ перевода Unicode в двоичный код, чтобы его символы можно было хранить в текстовых файлах. Вот где пригодится UTF-8.

UTF-8: последний фрагмент головоломки

UTF-8 — это система кодирования Unicode.Он может преобразовать любой символ Юникода в соответствующую уникальную двоичную строку, а также может преобразовать двоичную строку обратно в символ Юникода. Это значение «UTF» или «Формат преобразования Unicode».

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

Более конкретно, UTF-8 преобразует кодовую точку (которая представляет один символ в Unicode) в набор от одного до четырех байтов.Первые 256 символов в библиотеке Unicode, которые включают символы, которые мы видели в ASCII, представлены как один байт. Символы, которые появляются позже в библиотеке Unicode, кодируются как двухбайтовые, трехбайтовые и, возможно, четырехбайтовые двоичные единицы.

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

Знак Кодовая точка Двоичная кодировка UTF-8
А U + 0041 01000001
a U + 0061 01100001
0 U + 0030 00110000
9 U + 0039 00111001
! U + 0021 00100001
Ø U + 00D8 11000011 10011000
ڃ U + 0683 11011010 10000011
U + 0C9A 11100000 10110010 10011010
𠜎 U + 2070E 11110000 10100000 10011100 10001110
😁 U + 1F601 11110000 10011111 10011000 10000001

Почему UTF-8 преобразовывает одни символы в один байт, а другие — в четыре байта? Короче для экономии памяти.Используя меньше места для представления более общих символов (например, символов ASCII), UTF-8 уменьшает размер файла, позволяя использовать гораздо большее количество менее распространенных символов. Эти менее распространенные символы кодируются в два или более байта, но это нормально, если они хранятся редко.

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

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

Символы UTF-8 в веб-разработке

UTF-8 — наиболее распространенный метод кодировки символов, используемый сегодня в Интернете, и набор символов по умолчанию для HTML5.Более 95% всех веб-сайтов, в том числе и ваш собственный, хранят персонажей таким образом. Кроме того, распространенные методы передачи данных через Интернет, такие как XML и JSON, кодируются стандартами UTF-8.

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

Текстовые файлы, закодированные с помощью UTF-8, должны указывать на это программному обеспечению, обрабатывающему их.В противном случае программа не сможет должным образом преобразовать двоичный код обратно в символы. В файлах HTML вы можете увидеть строку кода, подобную следующему, вверху:

 
 

Это сообщает браузеру, что файл HTML закодирован в UTF-8, чтобы браузер мог преобразовать его обратно в разборчивый текст.

UTF-8 против UTF-16

Как я уже упоминал, UTF-8 — не единственный метод кодирования для символов Unicode — существует также UTF-16.Эти методы различаются количеством байтов, необходимых для хранения символа. UTF-8 кодирует символ в двоичную строку из одного, двух, трех или четырех байтов. UTF-16 кодирует символ Unicode в строку из двух или четырех байтов.

Это различие видно из их названий. В UTF-8 наименьшее двоичное представление символа — это один байт или восемь битов. В UTF-16 наименьшее двоичное представление символа составляет два байта или шестнадцать бит.

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

Знак Двоичная кодировка UTF-8 Двоичная кодировка UTF-16
А 01000001 01000001 11011000 00001110 11011111
𠜎 11110000 10100000 10011100 10001110 01000001 11011000 00001110 11011111

Кодировка

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

UTF-16 более эффективен, чем UTF-8, только на некоторых неанглоязычных сайтах. Если веб-сайт использует язык с символами, находящимися дальше в библиотеке Unicode, UTF-8 будет кодировать все символы как четыре байта, тогда как UTF-16 может кодировать многие из тех же символов только как два байта.Тем не менее, если ваши страницы заполнены буквами ABC и 123, придерживайтесь UTF-8.

Расшифровка мира кодировки UTF-8

Это было много слов о словах, поэтому давайте резюмируем то, что мы рассмотрели:

  1. Компьютеры хранят данные, включая текстовые символы, как двоичные (единицы и нули).
  2. ASCII был ранним способом кодирования или отображения символов в двоичный код, чтобы компьютеры могли их хранить. Однако в ASCII не было достаточно места для представления нелатинских символов и чисел в двоичном формате.
  3. Unicode был решением этой проблемы. Unicode присваивает уникальный «код» каждому символу на каждом человеческом языке.
  4. UTF-8 — это метод кодировки символов Юникода. Это означает, что UTF-8 берет кодовую точку для данного символа Юникода и переводит ее в строку двоичного кода. Он также делает обратное, считывая двоичные цифры и преобразуя их обратно в символы.
  5. UTF-8 в настоящее время является самым популярным методом кодирования в Интернете, поскольку он может эффективно хранить текст, содержащий любые символы.
  6. UTF-16 — еще один метод кодирования, но он менее эффективен для хранения текстовых файлов (за исключением тех, которые написаны на некоторых неанглийских языках).

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

Но если вы обнаружите, что страницы вашего веб-сайта занимают чрезмерно много места или если ваш текст усеян буквами и, пора применить ваши новые знания о UTF-8.

Кодировок символов для начинающих

Во-первых, какое мне дело?

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

Например, вы можете сделать так, чтобы текст выглядел так:

, но на самом деле он может отображаться так:

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

Так что за кодировка символов?

Слова и предложения в тексте состоят из символов . Примеры символов включают латинскую букву á, китайскую идеограмму 請 или символ деванагари ह.

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

Персонажи, необходимые для определенной цели, сгруппированы в набор символов (также называемый репертуаром ). (Чтобы однозначно обозначать символы, каждый символ связан с числом, называемым кодовой точкой .)

Символы хранятся в компьютере как один или несколько байтов .

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

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

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

К сожалению, существует много разных наборов символов и кодировок символов, т.е. много разных способов сопоставления байтов, кодовые точки и символы. В разделе «Дополнительная информация» для тех, кому интересно, чуть подробнее.

Однако в большинстве случаев вам не нужно знать подробности. Вам просто нужно быть уверенным, что вы прислушиваетесь к советам в раздел Как это влияет на меня? ниже.

Как в это вписываются шрифты?

Шрифт — это набор определений глифов, т.е.определения форм, используемых для отображения символов.

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

Данный шрифт обычно покрывает один набор символов или, в случае большого набора символов, например Unicode, только подмножество всех персонажей в наборе.Если в вашем шрифте нет глифа для определенного символа, некоторые браузеры или программные приложения будут искать недостающие глифы в других шрифты в вашей системе (что будет означать, что глиф будет отличаться от окружающего текста, как записка с требованием выкупа). В противном случае вы обычно вместо этого вы увидите квадратную рамку, вопросительный знак или какой-либо другой символ. Например:

Как это повлияет на меня?

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

Авторы контента должны узнать, как объявить персонажа кодировка, используемая для формата документа, с которым они работают.

Обратите внимание, что просто объявление другой кодировки на вашей странице не изменит байты; вам нужно сохранить текста в этой кодировке.

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

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

По ссылкам ниже можно найти дополнительную информацию по этим темам.

В этом разделе представлена ​​небольшая дополнительная информация о сопоставлении байтов, кодовых точек и символов для тех, кому это интересно. Не стесняйтесь просто перейти к разделу Дополнительная литература.

Обратите внимание, что номера кодовых точек обычно выражаются в шестнадцатеричной системе счисления, т.е. основание 16. Например, 233 в шестнадцатеричной форме — это E9.Значения кодовой точки Unicode обычно записываются в форме U + 00E9.

В наборе кодированных символов под названием ISO 8859-1 (также известном как Latin1) значение десятичной кодовой точки для буквы é равно 233. Однако в ISO 8859-5, та же кодовая точка представляет кириллический символ щ.

Эти наборы символов содержат менее 256 символов и напрямую сопоставляют кодовые точки с байтовыми значениями, поэтому кодовая точка со значением 233 представлена ​​одним байтом со значением 233.Обратите внимание, что только контекст определяет, представляет ли этот байт либо é, либо щ.

Есть и другие способы работы с символами из ряда скриптов. Например, с набором символов Unicode вы можете представить оба символа в одном наборе. Фактически, Юникод содержит в одном наборе, вероятно, все символы, которые вам когда-либо понадобятся. Хотя буква é по-прежнему представлена ​​значением кодовой точки 233, кириллический символ щ теперь имеет значение кодовой точки 1097.

С другой стороны, 1097 слишком большое число, чтобы его можно было представить одним байт*. Итак, если вы используете кодировку символов для текста Unicode под названием UTF-8, щ будет представлен двумя байтами. Тем не менее значение кодовой точки не просто выводится из значения двух байтов, соединенных вместе — требуется более сложное декодирование.

Другой Unicode символы отображаются в один, три или четыре байта в кодировке UTF-8.

Кроме того, обратите внимание, что буква é также представлена ​​двумя байтами в UTF-8, а не одним байтом, используемым в ISO 8859-1. (Только символы ASCII кодируются одним байтом в UTF-8.)

UTF-8 — это наиболее широко используемый способ представления текста Unicode на веб-страницах, и вы всегда должны использовать UTF-8 при создании веб-страниц и баз данных. Но, в принципе, UTF-8 — лишь один из возможных способов кодирования. Символы Юникода. Другими словами, одна кодовая точка в наборе символов Unicode может фактически отображаться в разные последовательности байтов, в зависимости от какая кодировка использовалась для документа.Кодовые точки Unicode могут быть сопоставлены с байтами с использованием любой из кодировок, называемых UTF-8, UTF-16 или UTF-32. Символ деванагари क с кодовой точкой 2325 (что составляет 915 в шестнадцатеричной системе счисления) будет представлен двумя байтов при использовании кодировки UTF-16 (09 15), трех байтов с UTF-8 (E0 A4 95) или четырех байтов с UTF-32 (00 00 09 15).

Могут быть и другие сложности помимо описанных в этом разделе (например, порядок байтов и escape-последовательности), но детали описанное здесь показывает, почему важно, чтобы приложение, с которым вы работаете, знало, какая кодировка символов подходит для ваших данных, и знает, как обрабатывать эту кодировку.

UTF-8 Кодировка


Сводка

UTF-8 — это компромиссная кодировка символов, которая может быть столь же компактной как ASCII (если файл представляет собой обычный текст на английском языке), но также может содержать любые символы юникода (с некоторым увеличением размера файла).

UTF означает формат преобразования Unicode. ‘8’ означает, что он использует 8-битные блоки для представляют собой персонажа. Количество блоков, необходимых для представления персонажа, варьируется от От 1 до 4.

Одной из действительно хороших особенностей UTF-8 является то, что он совместим со строками с завершающим нулем.При кодировании ни один символ не будет иметь нулевой (0) байт. Это означает, что код C, имеющий дело с char [] будет «просто работать».

Вы можете попробовать тестовую страницу UTF-8, чтобы увидеть, насколько хорошо ваш браузер (и шрифт по умолчанию) поддерживает UTF-8.

Если вы разработчик приложений, эта статья Joel On Software о Unicode — довольно хорошее резюме всего, что вам нужно знать.

Дополнительные ссылки:


Деталь

Для любого символа, равного или меньше 127 (шестнадцатеричный 0x7F), представление UTF-8 это один байт.Это всего лишь младшие 7 бит полного значения Unicode. Это также то же самое, что и значение ASCII.

Для символов, равных или меньше 2047 (шестнадцатеричное 0x07FF), представление UTF-8 распространяется на два байта. В первом байте будут установлены два старших бита и третий бит очищен (т.е. от 0xC2 до 0xDF). Второй байт будет иметь установлен верхний бит, а второй бит очищен (например, от 0x80 до 0xBF).

Для всех символов, равных или больше 2048, но меньше 65535 (0xFFFF), представление UTF-8 распространяется на три байта.

В следующей таблице показан формат таких байтовых последовательностей UTF-8 (где «свободные биты», обозначенные в таблице значками x, объединяются в порядок показан и интерпретируется от наиболее значимого до наименее значимого).

Двоичный формат байтов в последовательности

1-й байт 2-й байт 3-й байт 4-й байт Количество свободных битов Максимальное выражаемое значение Unicode
0xxxxxxx 7 007F шестигранник (127)
110xxxxx 10xxxxxx (5 + 6) = 11 07FF шестигранник (2047)
1110xxxx 10xxxxxx 10xxxxxx (4 + 6 + 6) = 16 FFFF шестигранник (65535)
11110xxx 10xxxxxx 10xxxxxx 10xxxxxx (3 + 6 + 6 + 6) = 21 10FFFF шестигранник (1,114,111)

Значение каждого отдельного байта указывает его функцию UTF-8, как показано ниже:

  • От 00 до 7F шестнадцатеричный (от 0 до 127): первый и единственный байт последовательности.
  • от 80 до BF шестнадцатеричный (от 128 до 191): продолжающий байт в многобайтовой последовательности.
  • C2 в шестнадцатеричный формат DF (194–223): первый байт двухбайтовой последовательности.
  • E0 в шестнадцатеричном формате EF (с 224 по 239): первый байт трехбайтовой последовательности.
  • F0 — FF шестнадцатеричный (от 240 до 255): первый байт четырехбайтовой последовательности.

UTF-8 остается простым однобайтовым, совместимым с ASCII методом кодирования до тех пор, пока непосредственно присутствуют символы больше 127. Это означает, что документ HTML технически объявленный как закодированный как UTF-8, может оставаться обычным однобайтовым файлом ASCII.Документ может остаться поэтому, даже если он может содержать символы Unicode выше 127, при условии, что все символы выше 127 упоминаются косвенно с помощью амперсандных сущностей.

Примеры закодированных символов Unicode (в шестнадцатеричной системе счисления)

16-битный Unicode Последовательность UTF-8
0001 01
007F 7F
0080 C2 80
07FF DF BF
0800 E0 A0 80
FFFF EF BF BF
010000 F0 90 80 80
10FFFF F4 8F BF BF

кодировка — Что такое Unicode, UTF-8, UTF-16?

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

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

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

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

Рекомендации по использованию памяти

Так сколько байтов к каким символам дают доступ в этих кодировках?

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

Теперь стоит упомянуть, что символы, не входящие в 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 имеет два байта, на него влияет порядок байтов. Для компенсации зарезервированная метка порядка байтов может быть размещена в начале потока данных, что указывает на порядок байтов.Таким образом, если вы читаете ввод UTF-16, а порядок байтов не указан, вы должны это проверить.

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

Практические рекомендации по программированию

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

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

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

Подсчет символов: Существуют , объединяющие символов в Unicode. Например, кодовая точка U + 006E (n) и U + 0303 (объединяющая тильда) образует ñ, а кодовая точка U + 00F1 образует ñ. Они должны выглядеть одинаково, но простой алгоритм подсчета вернет 2 в первом примере и 1 во втором. Это не обязательно неправильно, но может и не быть желаемым результатом.

Сравнение на равенство: A, А и Α выглядят одинаково, но они латынь, кириллица и греческий соответственно. У вас также есть падежи, такие как C и Ⅽ, одна буква, другая римская цифра. Кроме того, нам нужно учитывать и комбинирующие символы. Для получения дополнительной информации см. Дублирующиеся символы в Юникоде.

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

Другое ?:

Кодировка

— В чем разница между UTF-8 и Unicode?

В дополнение к другим ответам:

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

Компьютеры имеют дело с такими числами, как байты … пропуская здесь немного истории и игнорируя проблемы с адресацией памяти, 8-битные компьютеры будут рассматривать 8-битный байт как самую большую числовую единицу, легко представленную на оборудовании, 16-битные компьютеры будут расширите это до двух байтов и так далее.

Старые кодировки символов, такие как ASCII, относятся к (до) 8-битной эпохе и пытаются втиснуть доминирующий язык в вычислениях того времени, т.е.е. Английский, в числах от 0 до 127 (7 бит). С 26 буквами в алфавите, как заглавными, так и заглавными, числами и знаками препинания, это работало очень хорошо. ASCII был расширен на 8-й бит для других, не английских языков, но дополнительные 128 цифр / кодовых точек, предоставляемые этим расширением, будут сопоставлены с разными символами в зависимости от отображаемого языка. Стандарты ISO-8859 являются наиболее распространенными формами этого сопоставления; ISO-8859-1 и ISO-8859-15 (также известные как ISO-Latin-1, latin1, и да, есть две разные версии стандарта 8859 ISO).

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

По сути, существует два разных типа кодирования: один расширяет диапазон значений, добавляя дополнительные биты. Примерами этих кодировок могут быть UCS2 (2 байта = 16 бит) и UCS4 (4 байта = 32 бита). По сути, они страдают той же проблемой, что и стандарты ASCII и ISO-8859, поскольку их диапазон значений все еще ограничен, даже если предел значительно выше.

Другой тип кодирования использует переменное количество байтов на символ, и наиболее широко известными кодировками для этого являются кодировки UTF. Все кодировки UTF работают примерно одинаково: вы выбираете размер блока, который для UTF-8 составляет 8 бит, для UTF-16 — 16 бит, а для UTF-32 — 32 бит. Затем стандарт определяет некоторые из этих битов как флаги: если они установлены, то следующая единица в последовательности единиц должна считаться частью того же символа. Если они не установлены, эта единица полностью представляет один символ.Таким образом, наиболее распространенные (английские) символы занимают только один байт в UTF-8 (два в UTF-16, 4 в UTF-32), но символы других языков могут занимать шесть байтов и более.

Многобайтовые кодировки (после приведенного выше объяснения я бы сказал, что это многозначные) имеют то преимущество, что они относительно компактны, но обратная сторона заключается в том, что такие операции, как поиск подстрок, сравнения и т. Д., Должны декодировать символы в Unicode. кодовые точки до того, как такие операции могут быть выполнены (хотя есть некоторые ярлыки).

Как стандарты UCS, так и стандарты UTF кодируют кодовые точки, как определено в Unicode. Теоретически эти кодировки могут использоваться для кодирования любого числа (в пределах диапазона, поддерживаемого кодированием), но, конечно, эти кодировки были сделаны для кодирования кодовых точек Unicode. И это ваши отношения между ними.

Windows обрабатывает так называемые строки «Unicode» как строки UTF-16, в то время как большинство UNIX в наши дни по умолчанию используют UTF-8. Коммуникационные протоколы, такие как HTTP, как правило, лучше всего работают с UTF-8, поскольку размер блока в UTF-8 такой же, как и в ASCII, и большинство таких протоколов были разработаны в эпоху ASCII.С другой стороны, UTF-16 дает лучшую , среднюю производительность памяти / обработки при представлении всех живых языков.

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

Надеюсь, что пополнит ряд деталей.

unicode — UTF-8 — это кодировка или набор символов?

UTF-8 — это кодировка в том смысле, что она кодирует последовательность абстрактных целых чисел — кодовых точек Юникода, которые обозначают абстрактные символы — в набор байтов.(Через очки Unicode вы могли бы сказать, что «набор символов», такой как ISO-8859-1, также является «кодировкой», управляемой таблицами, в том смысле, что он кодирует небольшое количество кодовых точек как байты, но это приближается к злоупотребление терминологией и, вероятно, не очень полезно).

Последовательность целых чисел (в некотором фундаментальном смысле) является «строкой Unicode», но для того, чтобы сохранить их на диске или отправить по сети, вам необходимо закодировать их как последовательность байтов. UTF-8 — это один из способов сделать это, UTF-16 — другой: одна строка Unicode будет представлена ​​как два разных потока байтов, если она закодирована двумя разными способами.


Здесь есть несколько хороших ответов, но буквально вчера я потратил некоторое время, пытаясь свести эту проблему к какому-то минимальному размеру, так что это дает счастливую возможность повторно использовать этот текст:

Статья Джоэла Спольски об абсолютном минимуме, который должен знать каждый разработчик программного обеспечения о Unicode и наборах символов (без оправданий!), На мой взгляд, весьма хорош. Об этом (конечно) упоминалось здесь раньше, но стоит повторить. Я думаю, что это не совсем минимально.

В нескольких случаях, когда мне приходилось объяснять «юникод» коллеге, ключом к освещению оказалась идея абстрактных кодовых точек Юникода. Структура моих успешных объяснений была примерно такой:

  • Консорциуму Unicode удалось (с долгими мучениями и переговорами) присвоить число значительной части используемых символов. Эти числа (на жаргоне) называются «кодовыми точками».

  • «Буква А» имеет код, и он не зависит от шрифтов.Таким образом, «A» и «a» имеют разные кодовые точки, но римский, полужирный, курсив, с засечками, без засечек (и так далее) не различаются. Японские иероглифы, тенгвар и клингонские символы (например) имеют кодовые точки (это привлекает внимание).

  • «Строка Unicode» — это (концептуально) последовательность кодовых точек. Это последовательность математических целых чисел. Нет смысла спрашивать, являются ли это байтами, 2-байтовыми или 4-байтовыми словами; последовательность не имеет ничего общего с компьютерами.

  • Если, однако, вы хотите отправить кому-нибудь эту последовательность целых чисел или сохранить ее на диске компьютера, вам нужно что-то сделать, чтобы ее закодировать.Вы также можете записать последовательность чисел на листе бумаги, но давайте сейчас остановимся на компьютерах. Если вы хотите сохранить или отправить это на компьютер, вы должны преобразовать эти целые числа в последовательность байтов. Для этого существует несколько процедур, каждая из которых называется «кодировка». Одна из таких «кодировок» — UTF-8.

  • Когда вы «читаете файл Unicode», вы начинаете с последовательности байтов на диске и концептуально заканчиваете последовательностью целых чисел.Если указано, что «файл Unicode» каким-то образом должен быть закодирован в UTF-8, тогда вам необходимо декодировать эту последовательность байтов, чтобы получить последовательность целых чисел, используя алгоритм, определенный в RFC 3629. Все последующие операции с «Строка Юникода» определяется в терминах последовательности кодовых точек, и тот факт, что она начиналась на диске как «UTF-8», забывается.

Что такое UTF-8? — Twilio

UTF-8 — это стандарт кодировки символов переменной ширины, который использует от одного до четырех восьмибитных байтов для представления всех допустимых кодовых точек Unicode.21), более чем достаточно для покрытия текущих 1112 064 кодовых точек Unicode.

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

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

Обратная совместимость с ASCII

UTF-8 использует один байт для представления кодовых точек от 0 до 127. Эти первые 128 кодовых точек Unicode взаимно однозначно соответствуют отображению символов ASCII, поэтому символы ASCII также являются допустимыми символами UTF-8.

Как работает UTF-8: пример

Первый байт UTF-8 указывает, сколько байтов будет следовать за ним.Затем биты кодовой точки «распределяются» по следующим байтам. Лучше всего это пояснить на примере:

Unicode присваивает французскую букву é кодовой точке U + 00E9. Это 11101001 в двоичном формате; он не является частью набора символов ASCII. UTF-8 представляет это восьмибитное число с использованием двух байтов.

Старшие биты обоих байтов содержат метаданные. Первый байт начинается с 110 . Единицы указывают, что это двухбайтовая последовательность, а 0 указывает, что за ней последуют биты кодовой точки.Второй байт начинается с 10, чтобы указать, что это продолжение последовательности UTF-8.

Это оставляет 11 «слотов» для битов кодовой точки. Помните, что для кодовой точки U + 00E9 требуется всего восемь бит. UTF-8 дополняет ведущие биты тремя значениями 0 , чтобы полностью «заполнить» оставшиеся пробелы.

Результирующее представление UTF-8 для é (U + 00E9): 1100001110101001 .

Как Twilio обрабатывает символы UTF-8?

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

Для SMS-сообщений Twilio использует самый компактный из доступных методов кодирования. Twilio по умолчанию использует GSM-7 и возвращается к UCS-2, если ваше сообщение содержит символы, отличные от GSM-7. Использование стандартов кодирования GSM-7 и UCS-2 может повлиять на количество сегментов, необходимых для отправки вашего сообщения.

Twilio Copilot Smart Encoding автоматически определяет символы Юникода, которые легко пропустить, такие как умные кавычки (〞) или длинное тире (-), и заменяет их аналогичным символом. Благодаря этому количество сегментов сообщения и цены будут как можно более низкими.

Не беспокойтесь, если ваша строка в кодировке UTF-8 «Ooh làlà» будет доставлена ​​по SMS — Программируемое SMS-сообщение Twilio поможет вам.

.
Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *