[непроверенная версия][непроверенная версия]
Содержимое удалено Содержимое добавлено
Спасено источников — 1, отмечено мёртвыми — 0. Сообщить об ошибке. См. FAQ.) #IABot (v2.0.8
Строка 1:
* ку
'''UTF-8''' (от {{lang-en|Unicode Transformation Format, 8-bit}} — «формат преобразования Юникода, 8-бит») — распространённый стандарт кодирования [[Набор символов|символов]], позволяющий более компактно хранить и передавать символы [[Юникод]]а, используя переменное количество байт (от 1 до 4), и обеспечивающий полную обратную совместимость с 7-битной кодировкой [[ASCII]]. Стандарт UTF-8 официально закреплён в документах RFC 3629 и ISO/IEC 10646 Annex D.
 
Кодировка UTF-8 сейчас является доминирующей в веб-пространстве. Она также нашла широкое применение в [[UNIX-подобная операционная система|UNIX-подобных операционных системах]]<ref>[http://w3techs.com/technologies/overview/character_encoding/all Usage Statistics of Character Encodings for Websites, June 2011]{{ref-en}}</ref>.
 
Формат UTF-8 был разработан [[2 сентября]] [[1992 год]]а [[Томпсон, Кен|Кеном Томпсоном]] и [[Пайк, Роб|Робом Пайком]], и реализован в [[Plan 9]]<ref>{{Cite web |url=http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt |title=Архивированная копия |accessdate=2007-02-27 |archive-date=2011-03-01 |archive-url=https://web.archive.org/web/20110301051538/http://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt |deadlink=yes }}{{ref-en}}</ref>. Идентификатор кодировки в Windows — 65001<ref>[https://docs.microsoft.com/en-us/windows/desktop/intl/code-page-identifiers Code Page Identifiers — Windows applications | Microsoft Docs<!-- Заголовок добавлен ботом -->]</ref>.
 
UTF-8, по сравнению с [[UTF-16]], наибольший выигрыш в компактности даёт для текстов на [[латиница|латинице]], поскольку латинские буквы без [[Диакритические знаки|диакритических знаков]], цифры и наиболее распространённые знаки препинания кодируются в UTF-8 лишь одним байтом, и коды этих символов соответствуют их кодам в [[ASCII]].<ref name="stringtheory">
{{Cite web
|url = http://weblogs.mozillazine.org/roc/archives/2008/01/string_theory.html
|title = String Theory
|author = Well, I'm Back
|work = Robert O'Callahan
|lang = en
|datepublished = 2008-03-01
|accessdate = 2008-03-01
|archiveurl = https://www.webcitation.org/6193EbztY?url=http://robert.ocallahan.org/2008/01/string-theory_08.html
|archivedate = 2011-08-23
}}
</ref><ref name="vsem">
{{Cite web
|url = http://webmastak.com/article.aspx?id=300
|title = Всем кодировкам кодировка. UTF‑8: современно, грамотно, удобно.
|author = Ростислав Чебыкин
|work = HTML и CSS
|accessdate = 2009-03-22
|archiveurl = https://www.webcitation.org/6193F9SrL?url=http://webmastak.com/article.aspx?id=300
|archivedate = 2011-08-23
}}</ref>
 
== Алгоритм кодирования ==
Алгоритм кодирования в UTF-8 стандартизирован в <nowiki>RFC 3629</nowiki> и состоит из 3 этапов:
 
1. Определить количество [[Октет (информатика)|октетов]] ([[байт]]ов), требуемых для кодирования символа. Номер символа берётся из стандарта Юникода.
{| class="wikitable"
!Диапазон номеров символов
!Требуемое количество октетов
|-
|<code>00000000-0000007F</code>
|1
|-
|<code>00000080-000007FF</code>
|2
|-
|<code>00000800-0000FFFF</code>
|3
|-
|<code>00010000-0010FFFF</code>
|4
|}
Для символов Юникода с номерами от <code>U+0000</code> до <code>U+007F</code> (занимающими один байт c нулём в старшем бите) кодировка UTF-8 полностью соответствует 7-битной кодировке US-ASCII.
 
2. Установить старшие [[бит]]ы первого октета в соответствии с необходимым количеством октетов, определённом на первом этапе:
* 0xxxxxxx — если для кодирования потребуется ''один'' октет;
* 110xxxxx — если для кодирования потребуется ''два'' октета;
* 1110xxxx — если для кодирования потребуется ''три'' октета;
* 11110xxx — если для кодирования потребуется ''четыре'' октета.
Если для кодирования требуется больше одного октета, то в октетах 2-4 два старших бита всегда устанавливаются равными 10<sub>2</sub> (10xxxxxx). Это позволяет легко отличать первый октет в потоке, потому что его старшие биты никогда не равны 10<sub>2</sub>.
{| class="wikitable"
!Количество октетов
!Значащих бит
!Шаблон
|-
|1
|7
|<code>0xxxxxxx</code>
|-
|2
|11
|<code>110xxxxx 10xxxxxx</code>
|-
|3
|16
|<code>1110xxxx 10xxxxxx 10xxxxxx</code>
|-
|4
|21
|<code>11110xxx 10xxxxxx 10xxxxxx 10xxxxxx</code>
|}
 
3. Установить значащие биты октетов в соответствии с номером символа [[Юникод]]а, выраженном в двоичном виде. Начать заполнение с младших битов номера символа, поставив их в младшие биты последнего октета, продолжить справа налево до первого октета. Свободные биты первого октета, оставшиеся незадействованными, заполнить нулями.
 
=== Примеры кодирования ===
{| class="wikitable" style="text-align:right;"
|-
!colspan=2|Символ
! Двоичный код символа
! UTF-8 в двоичном виде
! UTF-8 в шестнадцатеричном виде
|-
|[[Символ доллара|$]] || <code>U+0024</code>
|<code>{{color|red|0100100}}</code>
|<code>0{{color|red|0100100}}</code>
|<code>{{color|black|24}}</code>
|-
|[[Символ цента|¢]] || <code>U+00A2</code>
|<code>{{color|green|10}}{{color|red|100010}}</code>
|<code>110{{color|green|00010}} 10{{color|red|100010}}</code>
|<code>{{color|black|C2}} {{color|black|A2}}</code>
|-
|[[Символ евро|€]] || <code>U+20AC</code>
|<code>{{color|blue|10}}{{color|green|0000}} {{color|green|10}}{{color|red|101100}}</code>
|<code>1110{{color|blue|0010}} 10{{color|green|000010}} 10{{color|red|101100}}</code>
|<code>{{color|black|E2}} {{color|black|82}} {{color|black|AC}}</code>
|-
|[[Хвайр|𐍈]] || <code>U+10348</code>
|<code>{{color|blue|1 0000}}{{color|green|0011 01}}{{color|red|001000}}</code>
|<code>11110{{color|#C000C0|000}} 10{{color|blue|010000}} 10{{color|green|001101}} 10{{color|red|001000}}</code>
|<code>{{color|black|F0}} {{color|black|90}} {{color|black|8D}} {{color|black|88}}</code>
|}
 
== Маркер UTF-8 ==
Для указания, что файл или поток содержит символы Юникода, в начале файла или потока может быть вставлен [[маркер последовательности байтов]] ({{lang-en|Byte order mark, BOM}}), который в случае кодирования в UTF-8 принимает форму трёх байтов: <code>EF BB BF<sub>16</sub></code>.
{| class="wikitable"
|-
! !! 1-й байт !! 2-й байт !! 3-й байт
|-
| [[Бинарный код|Двоичный код]] || <code>1110 1111</code> || <code>1011 1011</code> || <code>1011 1111</code>
|-
|[[Шестнадцатеричная система счисления|Шестнадцатеричный код]]
|<code>EF</code>
|<code>BB</code>
|<code>BF</code>
|}
 
== Пятый и шестой байты ==
Изначально кодировка UTF-8 допускала использование до шести байтов для кодирования одного символа, однако в ноябре 2003 года стандарт RFC 3629 запретил использование пятого и шестого байтов, а диапазон кодируемых символов был ограничен символом <code>U+10FFFF</code>. Это было сделано для обеспечения совместимости с UTF-16.
 
== Возможные ошибки декодирования ==
Не всякая последовательность байтов является допустимой. Декодер UTF-8 должен понимать и адекватно обрабатывать такие ошибки:
* Недопустимый байт.
* Байт продолжения (10xxxxxx) без начального байта.
* Отсутствие нужного количества байтов продолжения 10xxxxxx — например, двух после 1110xxxx).
* Строка обрывается посреди символа.
* Неэкономное кодирование — например, кодирование символа тремя байтами, когда можно двумя. (Существует нестандартный вариант UTF-8, который кодирует символ с кодом 0 как 1100.0000 1000.0000, отличая его от символа [[Нуль-терминированная строка|конца строки]] 0000.0000.)
* Последовательность байтов, декодирующаяся в недопустимую кодовую позицию (например, символу суррогатных пар [[UTF-16]]).
 
== Примечания ==
{{примечания}}
 
== Ссылки ==
* [http://unicode-table.com/ru/ UTF-8 encoding table and Unicode characters]
* [http://habrahabr.ru/post/138173/ UTF-8: Кодирование и декодирование]
* [http://www.unicode.org/faq/utf_bom.html#UTF8 UTF-8, UTF-16, UTF-32 & BOM — Вопросы и ответы]
* [http://www.unicode.org/reports/tr26/ Compatibility Encoding Scheme for UTF-16: 8-Bit (CESU-8)]
* [http://www.unicode.org/ Полное описание стандарта Unicode]
* [http://utf8everywhere.org/ UTF-8 Everywhere Manifesto]
* [http://www.ietf.org/rfc/rfc3629.txt RFC-3629 «UTF-8, a transformation format of ISO 10646»]
 
{{Кодировки символов}}