Warning: session_name(): Cannot change session name when session is active in /home/stalko/rodina-ru.com/docs/dokuwiki/inc/init.php on line 231

Warning: session_set_cookie_params(): Cannot change session cookie parameters when session is active in /home/stalko/rodina-ru.com/docs/dokuwiki/inc/init.php on line 232
======UTF-8====== **UTF-8** (от [[английский-язык|англ.]] //Unicode Transformation Format, 8-bit// — «формат преобразования Юникода, 8-битный») — одна из общепринятых и стандартизированных кодировок текста, которая позволяет хранить символы [[юникод|Юникода]], используя переменное количество байт (от 1 до 6). Стандарт UTF-8 официально закреплён в документах [[https://tools.ietf.org/html/rfc3629|RFC 3629]] и ISO/IEC 10646 Annex D. Кодировка нашла широкое применение в [[unix-подобная-операционная-система|UNIX-подобных операционных системах]] и веб-пространстве(([[http://w3techs.com/technologies/overview/character_encoding/all|Usage Statistics of Character Encodings for Websites, June 2011]]  (англ.))). Сам же формат UTF-8 был изобретён [[2-сентября|2 сентября]] [[1992-год|1992 года]] [[томпсон-кен|Кеном Томпсоном]] и [[пайк-роб|Робом Пайком]] и реализован в [[plan-9|Plan 9]].(([[http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt|http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt]]  (англ.))) В качестве [[byte-order-mark|BOM]] использует последовательность байт EF16, BB16, BF16 (что у неё самой является трёхбайтовой реализацией символа FEFF16). Одним из преимуществ является совместимость с ASCII — любые их 7-битные символы отображаются как есть, а остальные выдают пользователю [[кракозябры|мусор]] (шум). Поэтому в случае, если латинские буквы и простейшие знаки препинания (включая пробел) занимают существенный объём текста, UTF-8 даёт выигрыш по объёму по сравнению с [[utf-16|UTF-16]].((//Well, I'm Back.// [[http://weblogs.mozillazine.org/roc/archives/2008/01/string_theory.html|String Theory]] (англ.). //Robert O'Callahan// (1 March 2008). Проверено 1 марта 2008. [[http://www.webcitation.org/6193EbztY|Архивировано из первоисточника 23 августа 2011]].))((//Ростислав Чебыкин.// [[http://webmastak.com/article.aspx?id=300|Всем кодировкам кодировка. UTF‑8: современно, грамотно, удобно.]]. //HTML и CSS//. Проверено 22 марта 2009. [[http://www.webcitation.org/6193F9SrL|Архивировано из первоисточника 23 августа 2011]].)) =====Принцип кодирования===== Для номеров с U+0000 по U+007F кодировка UTF-8 полностью соответствует 7-битному [[ascii|US-ASCII]] c 0 в старшем бите и занимает один байт. Алгоритм кодирования в UTF-8 стандартизирован в RFC 3629 и состоит из 3 пунктов: 1. Определить количество [[октет-информатика|октетов]] ([[байт]]), требуемых для кодируемого номера символа в соответствии с таблицей: {| ! Диапазон символов ! Количество байт |- | ''00000000-0000007F'' | 1 |- | ''00000080-000007FF'' | 2 |- | ''00000800-0000FFFF'' | 3 |- | ''00010000-001FFFFF'' | 4 |- | ''00200000-03FFFFFF'' | 5 |- | ''04000000-7FFFFFFF'' | 6 |} 2. Подготовить старшие [[бит|биты]] первого октета (0xxxxxxx для одного октета, 110xxxxx - два, 1110xxxx - три и т.д.). Для остальных октетов два старших бита равны 10 (10xxxxxx). {| ! Количество байт ! Значащих бит ! Первый байт ! Шаблон полностью |- | 1 | 7 | ''0xxxxxxx'' | ''0xxxxxxx'' |- | 2 | 11 | ''110xxxxx'' | ''110xxxxx 10xxxxxx'' |- | 3 | 16 | ''1110xxxx'' | ''1110xxxx 10xxxxxx 10xxxxxx'' |- | 4 | 21 | ''11110xxx'' | ''11110xxx 10xxxxxx 10xxxxxx 10xxxxxx'' |- | 5 | 26 | ''111110xx'' | ''111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx'' |- | 6 | 31 | ''1111110x'' | ''1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx'' |} 3. Заполнить оставшиеся биты (в п.2 обозначены x) в октетах номером символа [[юникод|Юникода]], выраженном в двоичном виде. Начать с младших битов номера символа, поставив их в младшие биты последнего октета кода. И так далее, пока все биты номера символа не будут перенесены в свободные биты октетов. **Пример** Код [[маркер-последовательности-байтов|BOM]] для UTF-8 = ''EF BB BF(16)'' = ''1110 1111 1011 1011 1011 1111(2)'' {| ! ! 1 байт ! 2 байт ! 3 байт |- | Шаблон | ''1110 xxxx'' | ''10xx xxxx'' | ''10xx xxxx'' |- | [[бинарный-код|BIN]] | ''1110 1111'' | ''1011 1011'' | ''1011 1111'' |- | [[шестнадцатеричная-система-счисления|HEX]] | ''EF'' | ''BB'' | ''BF'' |} В таблице ниже значения представлены в шестнадцатеричной системе счисления. На практике для каждого значения выбирается единственное верное представление по алгоритму, стандартизированному в RFC 3629 (с минимальной длиной байт, большие — не разрешены; и представлены для наглядности и тестов кодировщиков). {| ! Код символа ! Имя символа ! 1 байт ! 2 байта ! 3 байта ! 4 байта ! 5 байт ! 6 байт |- | ''0000'' | NUL | ''00'' | ''C0 80'' | ''E0 80 80'' | ''F0 80 80 80'' | ''F8 80 80 80 80'' | ''FC 80 80 80 80 80'' |- | ''0073'' | Малая латинская s | ''73'' | ''C1 B3'' | ''E0 81 B3'' | ''F0 80 81 B3'' | ''F8 80 80 81 B3'' | ''FC 80 80 80 81 B3'' |- | ''041A'' | Большая кириллическая К | | ''D0 9A'' | ''E0 90 9A'' | ''F0 80 90 9A'' | ''F8 80 80 90 9A'' | ''FC 80 80 80 90 9A'' |- | ''0BF5'' | Символ года на [[тамильское-письмо|тамильском]] ௵ | | | ''E0 AF B5'' | ''F0 80 AF B5'' | ''F8 80 80 AF B5'' | ''FC 80 80 80 AF B5'' |- | ''26218'' | Китайский [[иероглиф]] 𦈘 | | | | ''F0 A6 88 98'' | ''F8 80 A6 88 98'' | ''FC 80 80 A6 88 98'' |- | ''10FFFF'' | Максимальный код Unicode | | | | ''F4 8F BF BF'' | ''F8 84 8F BF BF'' | ''FC 80 84 8F BF BF'' |- | ''7FFFFFFF'' | Максимальный код UCS-4 | | | | | | ''FD BF BF BF BF BF'' |} =====Конвертирование в UTF-8===== ====UTF-32LE в UTF-8==== Схемой можете воспользоваться при кодировании и раскодировании. {{wiki:utf-8-encoding-scheme.png?692x847|UTF-8 Encoding Scheme.png}} ====UTF-32BE в UTF-8==== Значащие биты в форме записи UTF-32BE располагаются подряд, начиная с заполнения младшего байта. Задача преобразования UTF-32BE в UTF-8 сводится к выбору соответствующей формы UTF-8 и копированию значащих битов UTF-32BE без каких либо дополнительных преобразований. * //Очень часто требуется проверять наличие старших битов числа.// * //Следующий код на [[язык-си|языке Си]] исключает случайные описки при наборе маски// #define UTF8_MASK( bits ) ( ~(( int )0) << ( bits ) ) if ( !( value & UTF8_MASK( 7 ) ) ) // 7 - количество значащих бит. // Можно подставлять также: 11, 16, 21, 26, 31.{ // Выполняется, если у числа нет битов, установленных в "1", кроме младших 7 } * //Предыдущий код будет заменен препроцессором на этот:// if ( !( value & 0xFFFFFF80 ) ){ } =====Максимальный потенциал===== До этого рассматривалось кодирование в UTF-8 лишь 32-битных целых без отрицательных значений. Следует отметить, что в стандарте Unicode используются символы лишь до кода 0010FFFF16 включительно. Поэтому даже 32-битных значений может вполне хватить, но этот раздел был включён для полноты изложения в случае использования UTF-8 для кодирования несимвольных данных. Алгоритм UTF-8 технически позволяет записывать код любой длины. Но для эффективной и надёжной работы алгоритма необходимо ограничение длины кода. Действующий стандарт Unicode 6.х предполагает использование кода до 21-го бита, то есть до четырех байт в UTF-8. ====Кодирование битовых цепочек==== {| ! Занимает байт ! Кодирует бит ! Представление кода по алгоритму UTF-8 |- | 1 | 7 | ''0xxx-xxxx'' |- | 2 | 11 | ''110x-xxxx 10xx-xxxx'' |- | 3 | 16 | ''1110-xxxx 10xx-xxxx 10xx-xxxx'' |- | 4 | 21 | ''1111-0xxx 10xx-xxxx 10xx-xxxx 10xx-xxxx'' |- | 5 | 26 | ''1111-10xx 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx'' |- | 6 | 31 | ''1111-110x 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx'' |- | 7 | 36 | ''1111-1110 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx 10xx-xxxx'' |- | 8 | 41 | ''1111-1111 100x-xxxx 10xx-xxxx … 10xx-xxxx'' |- | 9 | 46 | ''1111-1111 1010-xxxx 10xx-xxxx … 10xx-xxxx'' |- | 10 | 51 | ''1111-1111 1011-0xxx 10xx-xxxx … 10xx-xxxx'' |- | 11 | 56 | ''1111-1111 1011-10xx 10xx-xxxx … 10xx-xxxx'' |- | 12 | 61 | ''1111-1111 1011-110x 10xx-xxxx … 10xx-xxxx'' |- | 13 | 66 | ''1111-1111 1011-1110 10xx-xxxx … 10xx-xxxx'' |- | 14 | 71 | ''1111-1111 1011-1111 100x-xxxx 10xx-xxxx … 10xx-xxxx'' |- | 15 | 76 | ''1111-1111 1011-1111 1010-xxxx 10xx-xxxx … 10xx-xxxx'' |- | 16 | 81 | ''1111-1111 1011-1111 1011-0xxx 10xx-xxxx … 10xx-xxxx'' |- | 17 | 86 | ''1111-1111 1011-1111 1011-10xx 10xx-xxxx … 10xx-xxxx'' |- | 18 | 91 | ''1111-1111 1011-1111 1011-110x 10xx-xxxx … 10xx-xxxx'' |- | 19 | 96 | ''1111-1111 1011-1111 1011-1110 10xx-xxxx … 10xx-xxxx'' |- | 20 | 101 | ''1111-1111 1011-1111 1011-1111 100x-xxxx 10xx-xxxx … 10xx-xxxx'' |} =====Диапазоны Unicode===== В таблице ниже представлены диапазоны кодирования символов Unicode в UTF-8. {| ! Коды символов Unicode ([[шестнадцатеричная-система-счисления|HEX]]) ! Размер в UTF-8 ! Представленные классы символов |- | ''00000000'' — ''0000007F'' | 1 байт | [[ascii|ASCII]], в том числе [[латинский-алфавит|латинский алфавит]], простейшие [[знаки-препинания|знаки препинания]] и [[арабские-цифры|арабские цифры]] |- | ''00000080'' — ''000007FF'' | 2 байта | [[кириллица]], [[расширенная-латиница|расширенная латиница]], [[арабский-алфавит|арабский]], [[армянский-алфавит|армянский]], [[греческий-алфавит|греческий]], [[еврейский-алфавит|еврейский]] и [[коптский-алфавит|коптский алфавит]]; [[сирийское-письмо|сирийское письмо]], [[тана-письмо|тана]], [[нко-письмо|нко]]; [[международный-фонетический-алфавит|МФА]]; некоторые знаки препинания |- | ''00000800'' — ''0000FFFF'' | 3 байта | все другие современные формы письменности, в том числе [[грузинский-алфавит|грузинский алфавит]], [[индийское-письмо|индийское]], [[китайское-письмо|китайское]], [[корейское-письмо|корейское]] и [[японское-письмо|японское письмо]]; сложные знаки препинания; математические и другие специальные символы |- | ''00010000'' — ''001FFFFF'' | 4 байта | [[современная-музыкальная-нотация|музыкальные символы]], смайлы, редкие китайские иероглифы, вымершие формы письменности, ''00110000'' — ''001FFFFF'' не используется в Unicode |- | ''00200000'' — ''03FFFFFF'' | 5 байт | не используется в Unicode |- | ''04000000'' — ''7FFFFFFF'' | 6 байт | не используется в Unicode |} =====Отличительные значения байтов===== Отличительные значения байтов представлены в первую очередь для использования в алгоритмах автоматического определения кодировки текста. Первичным признаком можно считать [[byte-order-mark|BOM]], которая повышает вероятность использования той или иной кодировки (см. отдельную статью). Другим признаком является обнаружение не валидных или сильно маловероятных байт, или же наоборот вероятных. Здесь же следует отметить, что UTF-8 поддерживает кодирование 31-битных кодов UCS-4. Если речь касается символов Unicode, то пяти- и шестибайтовые значения оказываются сильно маловероятными. И есть ещё один примечательный момент — в кодировке UTF-8 возможно избыточное кодирование, что порождает многозначность. Например, ASCII-символ можно закодировать шестью вариантами байтовых последовательностей, но это не означает не валидность избыточных байтовых последовательностей. И здесь можно впасть в заблуждение когда первый байт содержит только нулевые биты значения — для последовательностей выше двух байт исключительно это нормально. Все значения представлены в шестнадцатеричной системе счисления. Под значением «сильно маловероятен» в колонке «статус» следует рассматривать использование кодировщика, который не отбрасывает лидирующие нули. {| ! Значение байта ! Статус ! Значение |- | ''00..7F'' | без сомнений | ASCII-символы. |- | ''80..BF'' | без сомнений | Любой не первый байт символа. |- | ''С0..C1'' | избыточное кодирование | Первый байт двухбайтового символа, который содержит ASCII-код. |- | ''C2..DF'' | без сомнений | Первый байт двухбайтового символа. |- | ''E0'' | небольшие сомнения | Первый байт трёхбайтового символа, но им же могут начинаться символы с избыточным кодированием (последовательности E0 80 и E0 81). |- | ''E1..EF'' | без сомнений | Первый байт трёхбайтового символа. |- | ''F0'' | небольшие сомнения | Первый байт четырёхбайтового символа, но им же могут начинаться символы с избыточным кодированием (последовательности F0 80 A0 и ниже по последнему байту). |- | ''F1..F7'' | без сомнений | Первый байт четырёхбайтового символа. |- | ''F8'' | небольшие сомнения | Первый байт пятибайтового символа, но им же могут начинаться символы с избыточным кодированием (последовательности F0 80 и F0 87). |- | ''F9..FB'' | без сомнений | Первый байт пятибайтового символа, не используется для кодирования Unicode. |- | ''FC'' | небольшие сомнения | Первый байт шестибайтового символа, но им же могут начинаться символы с избыточным кодированием (последовательности FС 80 и F0 83). |- | ''FD'' | без сомнений | Первый байт шестибайтового символа, не используется для кодирования Unicode. |- | ''FE..FF'' | невозможны при кодировании вплоть до 31 бита | У первого байта символа устанавливается столько старших битов, сколько байтов отводится под символ. Их конец обозначается терминальным битом 0, а оставшиеся биты соответствуют старшим битам значения. Байты 254 и 255 в двоичной системе: 111111102 и 111111112 соответствуют длинам 7 и 8, а длина 31 бит может быть закодирован шестью байтами. |} =====UTF-8 и ошибки кодирования/декодирования===== Примеры ниже приведены для быстрой ориентации в случаях некорректного декодирования текста (так называемые [[кракозябры]]). Так выглядит фраза «Человек сейчас увидит лишь то, что ожидает увидеть.» если она воспринята декодировщиком в кодировке Windows-1251, а не UTF-8:
ЧеР"овек сейчас СѓРІРёРґРёС‚ Р"ишь то, что ожидает увидеть.
Фраза «Человек сейчас увидит лишь то, что ожидает увидеть.» при двойном кодировании UTF-8 в UTF-8:
ЧеРВ"РѕРІРµРС" СЃРµРв"-час РЎС"РІРёРґРёС‚ Р В"ишь то, что ожидает РЎС"видеть.
=====Самосинхронизация и UTF-16===== Самосинхронизацию в UTF-8 можно рассмотреть когда вашей программе подаются случайные байты и вам нужно определить начало первого символа. Первичным признаком является сброшенный старший бит байта — это ASCII-символ. Если же он установлен, то пропускаем те байты, у которых сброшен бит перед старшим. В остальных случаях можно продолжать посимвольное поточное раскодирование. UTF-8 обладает свойством самосинхронизации при обработке 8-битными байтами. Альтернативной UTF-8 является кодировка [[utf-16|UTF-16]], которая уже обрабатывается 16-битными словами. Возможно возникновение сомнения что UTF-16 не является самосинхронизирующейся. В настоящий момент передача данных в компьютере в подавляющем большинстве производится цельными [[октет-информатика|октетами]] — 8 бит или ничего (см. [[ip|IPv4]], [[ipv6|IPv6]], [[sata|SATA]] для современной аппаратуры и [[ata|ATA]] с [[pata|PATA]] для недавней). В данных условиях UTF-8 имеет преимущество в характеристике самосинхронизации перед UTF-16, если речь касается аппаратной передачи данных или работы с байтовым [[поток-данных|потоком]] (чтение Unicode-данных с произвольной позиции). Если же работа осуществляется в оперативной памяти одной машины, то UTF-16 так же является самосинхронизирующейся (если аппаратура способна подавать цельные 16-битные слова). =====См. также===== * [[utf-16|UTF-16]] =====Ссылки===== * 1. [[http://unicode-table.com/ru/|UTF-8 encoding table and Unicode characters]] * 2. [[http://habrahabr.ru/post/138173/|UTF-8: Кодирование и декодирование]] на [[habrahabr]] * 3. [[http://www.unicode.org/faq/utf_bom.html#UTF8|UTF-8, UTF-16, UTF-32 & BOM — Вопросы и ответы]] * 4. [[http://www.unicode.org/reports/tr26/|Compatibility Encoding Scheme for UTF-16: 8-Bit (CESU-8)]] * 5. [[http://www.unicode.org/|Полное описание стандарта Unicode]] * 6. [[http://utf8everywhere.org/|UTF-8 Everywhere Manifesto]] занимается популяризацией UTF-8. * 7. [[http://www.ietf.org/rfc/rfc3629.txt|RFC-3629 "UTF-8, a transformation format of ISO 10646"]] Статус:Действующий Стандарт Интернет {| ! colspan="3"| [[категория-компьютерные-кодировки|Кодировки символов]] |- | colspan="2"| Основы | [[алфавит]] • [[текст]] ([[текстовый-файл|файл]] • [[текстовые-данные|данные]]) • [[набор-символов|набор символов]] • [[конверсия-графических-систем-письма|конверсия]] |- | rowspan="2"| Исторические кодировки | Докомп.: | [[семафорная-азбука|семафорная (Макарова)]] • [[азбука-морзе|Морзе]] • [[код-бодо|Бодо]] • [[мтк-2|МТК-2]] |- | Комп.: | [[шестибитная-кодировка|6-битная]] • [[код-упп|УПП]] • [[radix-50|RADIX-50]] • [[ebcdic|EBCDIC]] ([[дкои-8|ДКОИ-8]]) • [[кои-7|КОИ-7]] • [[iso-646|ISO 646]] |- | rowspan="5"| современное\\ [[октет-информатика|8-битное]]\\ представление | [[символьный-тип|символы]] | [[ascii|ASCII]] ([[управляющие-символы|управляющие]] • [[печатные-символы|печатные]]) • [[октеты-со-старшим-битом-1|не-ASCII]] ([[псевдографика]]) |- | 8-битные [[кодовая-страница|код.стр.]] | Кириллица: [[кои-8|КОИ-8]] • [[основная-кодировка|Основная кодировка]] • [[maccyrillic|MacCyrillic]] |- | [[iso-8859|ISO 8859]] | [[iso-8859-1|1 (лат.)]] • [[iso-8859-2|2]] • [[iso-8859-3|3]] • [[iso-8859-4|4]] • [[iso-8859-5|5 (кир.)]] • [[iso-8859-6|6]] • [[iso-8859-7|7]] • [[iso-8859-8|8]] • [[iso-8859-9|9]] • [[iso-8859-10|10]] • [[iso-8859-11|11]] • [[iso-8859-12|12]] • [[iso-8859-13|13]] • [[iso-8859-14|14]] • [[iso-8859-15|15 (€)]] • [[iso-8859-16|16]] |- | Windows | [[windows-1250|1250]] • [[windows-1251|1251 (кир.)]] • [[windows-1252|1252]] • [[windows-1253|1253]] • [[windows-1254|1254]] • [[windows-1255|1255]] • [[windows-1256|1256]] • [[windows-1257|1257]] • [[windows-1258|1258]] • [[windows-glyph-list-4|WGL4]] |- | IBM & DOS | [[cp437|437]] • [[cp850|850]] • [[cp852|852]] • [[cp855|855]] • [[альтернативная-кодировка|866 «альт.»]] • [[болгарская-кодировка|МИК]] • [[кодировка-нии-эвм|НИИ ЭВМ]] |- | rowspan="2"| [[широкий-символ|Многобайтные]] | Традиционные | [[dbcs|DBCS]] ([[gb2312|GB2312]]) • [[кодировки-символов-в-html|HTML]] |- | [[юникод|Unicode]] | [[utf-32|UTF-32]] • [[utf-16|UTF-16]] • **UTF-8** • [[символы-представленные-в-юникоде|список символов]] ([[кириллица-в-юникоде|кириллица]]) |- | colspan="2"| Связанные темы | [[текстовый-интерфейс-пользователя|интерфейс пользователя]] • [[раскладка-клавиатуры|раскладка клавиатуры]] • [[локаль]] • [[перевод-строки|перевод строки]] • [[шрифт]] • [[транслит]] • [[нестандартные-шрифты|нестандартные шрифты]] |- | colspan="2"| Утилиты | [[iconv]] • [[recode]] |}
{{tag>Юникод "Компьютерные кодировки"}}