Кодировка utf 8 что это такое
Кодировка UTF – основной стандарт текста в интернете
Нужно правильно раскодировать сигналы, которые наш мозг получает из окружающей среды. Проще говоря, следует правильно « настроить » свой взгляд на жизнь. Ну, вроде не полупустой кошелек, а наполовину полный. То есть, требуется использовать нужную кодировку. Для интернета чаще всего правильной является кодировка utf :
Немного о кодировках
Наверное, не является секретом тот факт, что основным типом содержимого во всемирном веб-пространстве является текст. Конечно, сейчас с этим утверждением можно поспорить, но буквально какой-то десяток лет назад это было так.
Но передача текста в цифровом формате происходит совсем иначе, чем у нас на экране. Для перевода текста в машинный код используется двоичная система исчисления, состоящая лишь из 0 и 1.
Чаще всего нужно всего лишь поменять кодировку веб-страницы на кодировку utf8. Ведь она является наиболее распространенной во всем интернете.
Кодировка UTF-8
Наиболее распространенная среди стандартизированных и общепринятых текстовых кодировок. Расшифровывается как « восьмибитный формат преобразования Юникода » или « Unicode Transformation Format ».
Стандарт был разработан еще в 1992 году. В настоящее время он широко применяется не только во всемирной паутине, но и на прикладном уровне ( локальные машины и операционные системы ). Основным достоинством кодировки является ее совместимость с ASCII:
ASCII («American standard code for information interchange») еще одна (но более старая) кодировка представления текстовых данных. В ее таблице символов значения печатных и непечатных знаков заданы с помощью чисел в шестнадцатеричной системе исчисления.
При использовании UTF-8 для передачи данных в формате ASCII используются 7 первых битов. Последний ( восьмой ) служит для вывода « мусора » ( некорректно раскодированных данных ). Что при использовании кодировки для латинских символов существенно уменьшает объем текстовых данных.
Как уже говорилось, часто для корректного отображения текста достаточно лишь поменять кодировку документа. Рассмотрим, как это можно сделать в различных дисциплинах, применяемых для построения веб-пространства.
Как установить кодировку в HTML и PHP
Глобальные настройки кодировки
Описанные выше методы могут использоваться для отдельных веб-страниц или небольших сайтов. Но что делать, если вы имеете дело с ресурсом, состоящим из нескольких сотен страниц и десятка разделов? Давайте разберемся, как установить кодировку utf 8 для всего сайта.
Как и в предыдущем примере, в нем нужно заменить значение AddDefaultCharset на нужное. В нашем случае это utf-8 :
Изменение кодировки базы данных
Здесь нужно поменять значение нескольких полей на utf-8 :
И затем добавить строку skip-character-set-client-handshake :
Сначала узнаем, какие кодировки установлены по умолчанию в нашей базе данных. Для этого вводим запрос SQL :
Вот какой ответ мы должны получить:
Если какие-либо значения нас не удовлетворяют, то нужно их изменить. Воспользуемся для этого запросом к ядру сервера СУБД:
Кодировка utf 8 что это такое
В отличие от UTF-16, UTF-8 является самосинхронизирующейся кодировкой (англ.): при потере одного байта последующие байты будут раскодированы корректно.
Проще говоря, в формате UTF-8 символы латинского алфавита, знаки препинания и управляющие символы ASCII записываются кодами US-ASCII, a все остальные символы кодируются при помощи нескольких байтов со старшим битом 1. Это приводит к двум эффектам.
На первый взгляд может показаться, что UTF-16 удобнее, так как в ней большинство символов кодируется ровно двумя байтами.
Однако это сводится на нет необходимостью поддержки суррогатных пар, о которых часто забывают при использовании UTF-16, реализуя лишь поддержку символов UCS-2. [2]
Формат UTF-8 был изобретён 2 сентября 1992 года Кеном Томпсоном и Робом Пайком и реализован в Plan 9. [4] Сейчас стандарт UTF-8 официально закреплён в документах RFC 3629 и ISO/IEC 10646 Annex D.
Содержание
Принцип кодирования
Текстовое описание
В UTF-8 можно кодировать значения кодов символов от 0 до 7FFFFFFF16 включительно (все комбинации 32-битных без установленного старшего бита).
Каждый символ кодируется переменным количеством последовательных 8-битных байт (октетов). Количество же может варьироваться от 1 до 6 байт включительно и определяется самым первым байтом.
Все ASCII-символы (от 0 до 127 (000000002 — 011111112 или 0016 — 7F16) включительно) записываются как есть одним байтом со сброшенным старшим битом.
Все остальные символы кодируются уже особым образом и далее текст этого раздела касается только их. Чтобы лучше понять принцип, лучше представляйте себе блоки бит с их позицией.
У байт не ASCII-символов старший бит всегда установлен в 1. При этом второй с конца бит всегда сброшен у не первых байт (у первых, соответственно, установлен). Поэтому если чтение производится с произвольного байта, то по второму биту можно определять промежуточные байты.
И у не первых байт остальные 6 младших бит содержат фрагмент кода символа (об этом ниже).
Количество байт, которое отводится под символ, всегда равно количеству идущих подряд старших бит со значением 1 в первом байте. Эти биты всегда завершаются битом со значением 0. Оставшиеся младшие биты первого байта составляют код символа. Отсюда обуславливается ограничение в 6 байт на символ — если выше, то в первом байте уже не хватит места под биты данных. Поэтому последовательности бит 111111102 (FE16) и 111111112 (FF16) общепринято считаются не используемыми в UTF-8.
До этого описывалась структура, а теперь про расположение данных.
Как видно из описания выше, каждый байт имеет определённое количество младших бит под данные — переменное у первого и по 6 в последующих. 32-битный код символа последовательно размещается в этих контейнерах. Старшие биты оказываются в первых байтах, а младшие — в последних. Поэтому младшие 6 бит последнего байта всегда содержат биты 0..5 кода символа. Аналогично, предпоследний байт содержат биты 6..11, третий с конца — 12..17, четвёртый — 18..23, пятый — 24..29. Первый байт же содержит оставшиеся старшие биты значения.
Зная структуру и расположение данных внутри байт, теперь рассмотрим взаимосвязь кода символа и количества байт.
Каждое количество байт способно хранить конкретный диапазон значений кода символа. При этом сами диапазоны значений расположены плотно по порядку без всяких просветов. Проиллюстрируем это соответствующей таблицей:
Коды символов Unicode (HEX) | Размер в UTF-8 | Представленные классы символов |
---|---|---|
00000000 — 0000007F | 1 байт | ASCII, в том числе латинский алфавит, простейшие знаки препинания и арабские цифры |
00000080 — 000007FF | 2 байта | кириллица, расширенная латиница, арабский, армянский, греческий, еврейский и коптский алфавит; сирийское письмо, тана, нко; МФА; некоторые знаки препинания |
00000800 — 0000FFFF | 3 байта | все другие современные формы письменности, в том числе грузинский алфавит, индийское, китайское, корейское и японское письмо; сложные знаки препинания; математические и другие специальные символы |
00010000 — 001FFFFF | 4 байта | музыкальные символы, редкие китайские иероглифы, вымершие формы письменности |
00200000 — 03FFFFFF | 5 байт | не используется в Unicode |
04000000 — 7FFFFFFF | 6 байт | не используется в Unicode |
Следует отметить, что данная таблица подразумевает плотное кодирование и поэтому она представляет только идеальные комбинации.
Кодировка UTF-8 не является однозначной, так как в ней учитывается размер бит значения без учёта позиции последнего установленного бита. Поэтому возможно написание «грубого» кодировщика, который не отбрасывает лидирующие нули. Например, ASCII-символ «1» (код 001100012 (3116)), может быть представлен следующими двухбайтовыми и трёхбайтовыми последовательностями: 110000002 101100012 (C016 B116) и 111000002 100000002 101100012 (E016 8016 B116). Отсюда выходят следующие бессмыленные битовые комбинации первых байт: 110000002 (C016), 111000002 (E016), 111100002 (F016), 111110002 (F816), 111111002 (FC16), а также последующие за ними комбинации промежуточных байт 100000002 (8016).
Графическое представление
Кодировка UTF-8 использует значения конкретных битов и учитывает расположение битовых блоков. Поэтому она может быть полноценно проиллюстрирована очевидным графическим образом. Если вам требуется быстро реализовать кодирование и раскодирование, то можете воспользоваться следующей схемой:
Максимальный потенциал
До этого рассматривалось кодирование в UTF-8 лишь 32-битных целых без отрицательных значений. Следует отметить, что в стандарте Unicode используются символы лишь до кода 001FFFFF16 включительно. Поэтому даже 32-битных значений может вполне хватить, но этот раздел был включён для полноты изложения в случае использования UTF-8 для кодирования несимвольных данных.
В первом байте количество установленных старших бит определяет количество байт на символ. Оставшиеся младшие биты хранят старшие биты значения кода символа. Мы можем сделать допущение о том, что первый байт не обязан содержать данные. При этом допускаем, что все биты за пределами байта равны нулю. Тогда данные будут содержать только 6 бит в последующих байтах. Получается 36 бит для семибайтового символа и 42 бита — для восьмибайтового.
Неиспользуемые значения байтов
BOM (сигнатура)
Многие программы Windows (включая Блокнот) добавляют байты EF16, BB16, BF16 в начале любого документа, сохраняемого как UTF-8. Это метка порядка байтов (англ. Byte Order Mark, BOM), также её часто называют сигнатурой (соответственно, UTF-8 и UTF-8 with Signature). По наличию сигнатуры программы могут автоматически определить, является ли файл закодированным в UTF-8, однако файлы с такой сигнатурой могут некорректно обрабатываться старыми программами, в частности xml-анализаторами. Такие редакторы, как Notepad++, Notepad2 и Kate, позволяют явно указывать, следует ли добавлять сигнатуру при сохранении UTF-файлов.
Например: В файле записана одна латинская буква «a».
Если считывающая программа не поддерживает BOM, то эти три байта успешно раскодируются в один Unicode-символ FEFF16. Это не разрывающий слова пробел нулевой ширины и поэтому он может не отобразиться. Этот же символ используется в BOM для кодировок UTF-16 и UTF-32.
Национальная библиотека им. Н. Э. Баумана
Bauman National Library
Персональные инструменты
Содержание
История создания
До появления Unicode UTF-8 широко использовались другие кодировки (ASCII, ISO/IEC 646, ISO/IEC 8859, KOI8, Windows-125x).
Впервые кодировка UTF-8 была официально представлена на конференции USENIX в Сан Диего в январе 1993. От других мультибайтных кодировок ее отличала полная совместимость с ASCII: все символы ASCII в UTF-8 кодируются 7 битами. Каждый символ кодировки, отличный от ASCII, состоит из ведущего байта, указывающего длину последовательности, и одного или нескольких продолжающих байт. Такой принцип позволяет определить длину последовательности только по первому байту. Коды символов ASCII, ведущих и продолжающих байт не пересекаются, что позволяет легко найти начало последовательности простым откатом назад максимум на пять байт.
В ноябре 2003 года стандартом RFC-3629 максимальная длина последовательности UTF-8 была ограничена четырьмя байтами, однако потенциально UTF-8 позволяет использовать последовательности вплоть до шести байт. На сегодняшний день самой распространенной кодировкой является UTF-8. Она включает в себя более двух миллионов символов: все возможные современные алфавиты, цифры, знаки препинания, математические и специальные символы, музыкальные знаки и символы вымерших форм письменности. А резерва UTF-8 хватит для размещения более двух миллиардов символов. Так что о смене кодировки в ближайшее время задумываться не придётся.
Однако торжество современных технологий — явление относительно новое. Согласно Google, самой распространенной в интернете кодировкой UTF-8 стала только в 2008 году — тогда ее использовали чуть более чем 25% проиндексированных веб-страниц. А еще в 2006 UTF-8 использовали менее чем 10% веб-страниц.
Стремительный рост популярности кодировки UTF-8 связан с целым рядом ее преимуществ перед предшественницами. [Источник 3]
Принципы работы
UTF-8 является лишь представлением Unicode в 8-битном виде. Символы с кодами меньше 128 представляются одним байтом (Латинский алфавит, простейшие знаки препинания и арабские цифры), а так как в Unicode они повторяют ASCII, то текст написанный только этими символами будет являться текстом в ASCII.
Символы с кодами от:
5 и 6 байтов не используется в Unicode. [Источник 4]
Преимущества и недостатки
Общие преимущества
В сравнении с однобайтовыми кодировками.
Преимущества
Недостатки
Сравнение с другими многобайтовыми кодировками
Преимущества
Недостатки
Сравнение с UTF-16
Преимущества
Недостатки
Макет кодовой страницы
_0 | _1 | _2 | _3 | _4 | _5 | _6 | _7 | _8 | _9 | _A | _B | _C | _D | _E | _F | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0_ | NUL 0000 0 | SOH 0001 1 | STX 0002 2 | ETX 0003 3 | EOT 0004 4 | ENQ 0005 5 | ACK 0006 6 | BEL 0007 7 | BS 0008 8 | HT 0009 9 | LF 000A 10 | VT 000B 11 | FF 000C 12 | CR 000D 13 | SO 000E 14 | SI 000F 15 |
1_ | DLE 0010 16 | DC1 0011 17 | DC2 0012 18 | DC3 0013 19 | DC4 0014 20 | NAK 0015 21 | SYN 0016 22 | ETB 0017 23 | CAN 0018 24 | EM 0019 25 | SUB 001A 26 | ESC 001B 27 | FS 001C 28 | GS 001D 29 | RS 001E 30 | US 001F 31 |
2_ | SP 0020 32 | ! 0021 33 | » 0022 34 | # 0023 35 | $ 0024 36 | % 0025 37 | & 0026 38 | ‘ 0027 39 | ( 0028 40 | ) 0029 41 | * 002A 42 | + 002B 43 | , 002C 44 | — 002D 45 | . 002E 46 | / 002F 47 |
3_ | 0 0030 48 | 1 0031 49 | 2 0032 50 | 3 0033 51 | 4 0034 52 | 5 0035 53 | 6 0036 54 | 7 0037 55 | 8 0038 56 | 9 0039 57 | : 003A 58 | ; 003B 59 | 003C 60 | = 003D 61 | > 003E 62 | ? 003F 63 |
4_ | @ 0040 64 | A 0041 65 | B 0042 66 | C 0043 67 | D 0044 68 | E 0045 69 | F 0046 70 | G 0047 71 | H 0048 72 | I 0049 73 | J 004A 74 | K 004B 75 | L 004C 76 | M 004D 77 | N 004E 78 | O 004F 79 |
5_ | P 0050 80 | Q 0051 81 | R 0052 82 | S 0053 83 | T 0054 84 | U 0055 85 | V 0056 86 | W 0057 87 | X 0058 88 | Y 0059 89 | Z 005A 90 | [ 005B 91 | \ 005C 92 | ] 005D 93 | ^ 005E 94 | _ 005F 95 |
6_ | ` 0060 96 | a 0061 97 | b 0062 98 | c 0063 99 | d 0064 100 | e 0065 101 | f 0066 102 | g 0067 103 | h 0068 104 | i 0069 105 | j 006A 106 | k 006B 107 | l 006C 108 | m 006D 109 | n 006E 110 | o 006F 111 |
7_ | p 0070 112 | q 0071 113 | r 0072 114 | s 0073 115 | t 0074 116 | u 0075 117 | v 0076 118 | w 0077 119 | x 0078 120 | y 0079 121 | z 007A 122 | < 007B 123 | | 007C 124 | > 007D 125 | 007E | DEL 007F 127 |
8_ | • +00 128 | • +01 129 | • +02 130 | • +03 131 | • +04 132 | • +05 133 | • +06 134 | • +07 135 | • +08 136 | • +09 137 | • +0A 138 | • +0B 139 | • +0C 140 | • +0D 141 | • +0E 142 | • +0F 143 |
9_ | • +10 144 | • +11 145 | • +12 146 | • +13 147 | • +14 148 | • +15 149 | • +16 150 | • +17 151 | • +18 152 | • +19 153 | • +1A 154 | • +1B 155 | • +1C 156 | • +1D 157 | • +1E 158 | • +1F 159 |
A_ | • +20 160 | • +21 161 | • +22 162 | • +23 163 | • +24 164 | • +25 165 | • +26 166 | • +27 167 | • +28 168 | • +29 169 | • +2A 170 | • +2B 171 | • +2C 172 | • +2D 173 | • +2E 174 | • +2F 175 |
B_ | • +30 176 | • +31 177 | • +32 178 | • +33 179 | • +34 180 | • +35 181 | • +36 182 | • +37 183 | • +38 184 | • +39 185 | • +3A 186 | • +3B 187 | • +3C 188 | • +3D 189 | • +3E 190 | • +3F 191 |
2-byte C_ | 0000 192 | 0040 193 | Latin 0080 194 | Latin 00C0 195 | Latin 0100 196 | Latin 0140 197 | Latin 0180 198 | Latin 01C0 199 | Latin 0200 200 | IPA 0240 201 | IPA 0280 202 | IPA 02C0 203 | accents 0300 204 | accents 0340 205 | Greek 0380 206 | Greek 03C0 207 |
2-byte D_ | Cyril 0400 208 | Cyril 0440 209 | Cyril 0480 210 | Cyril 04C0 211 | Cyril 0500 212 | Armeni 0540 213 | Hebrew 0580 214 | Hebrew 05C0 215 | Arabic 0600 216 | Arabic 0640 217 | Arabic 0680 218 | Arabic 06C0 219 | Syriac 0700 220 | Arabic 0740 221 | Thaana 0780 222 | N’Ko 07C0 223 |
3-byte E_ | Indic 0800* 224 | Misc. 1000 225 | Symbol 2000 226 | Kana, CJK 3000 227 | CJK 4000 228 | CJK 5000 229 | CJK 6000 230 | CJK 7000 231 | CJK 8000 232 | CJK 9000 233 | Asian A000 234 | Hangul B000 235 | Hangul C000 236 | Hangul D000 237 | PUA E000 238 | Forms F000 239 |
4‑byte F_ | SMP, SIP 10000* 240 | 40000 241 | 80000 242 | SSP, SPUA C0000 243 | SPUA-B 100000 244 | 140000 245 | 180000 246 | 1C0000 247 | 5-byte 200000* 248 | 5-byte 1000000 249 | 5-byte 2000000 250 | 5-byte 3000000 251 | 6-byte 4000000* 252 | 6-byte 40000000 253 | 254 | 255 |
Оранжевые ячейки с большой точкой являются байтами продолжения. Шестнадцатеричное число, указанное после знака «+», представляет собой значение шести бит, которые они добавляют.
Красные клетки никогда не должны появляться в действительной последовательности UTF-8. Первые два (C0 и C1) могли использоваться только для недопустимого «чрезмерного кодирования» символов ASCII (то есть, пытаясь закодировать 7-битное значение ASCII между 0 и 127, используя два байта вместо одного, см. Ниже). Оставшиеся красные ячейки указывают ведущие байты последовательностей, которые могут только кодировать числа, превышающие предел 0x10FFFF в Юникоде, или которые также никогда не использовались в исходном проекте для 31 бита (FE и FF).
Розовые ячейки являются ведущими байтами для последовательности из нескольких байтов, из которых допустимы некоторые, но не все возможные последовательности продолжения. E0 и F0 могут начинать сглаженные кодировки, в этом случае отображается самая низкая незашифрованная кодовая точка, помеченная звездочкой «*». F4 может запускать кодовые точки более 0x10FFFF, которые являются недопустимыми. ED может начать кодирование суррогатной половины, которая не может быть закодирована в UTF-16 и также недействительна.
Кодирование и декодирование
UTF-32LE в UTF-8
Схемой можете воспользоваться при кодировании и раскодировании.
Эта схема сделана так, чтобы вы видели какие биты куда попадают как при кодировании, так и раскодировании. По ней видно что при этих обоих процессах просто нужные биты выставляются на нужные позиции при нужных значениях контрольных бит. Можно заметить что компоновка в больших байтовых последовательностях осуществляется по 6 бит (в так называемых лидирующих байтах). При этом старшие биты предусматриваемого кода будут в первых байтах (схоже с порядком Big-Endian). [Источник 7]
Кодирование
Порядок действий такой:
Function EncodeUTF8(s)
Декодирование
Function DecodeUTF8(s)
Ошибки кодирования/декодирования
Примеры ниже приведены для быстрой ориентации в случаях некорректного декодирования текст. Так выглядит фраза «Человек сейчас увидит лишь то, что ожидает увидеть.» если она воспринята декодировщиком в кодировке Windows-1251, а не UTF-8:
ЧеловеРѻ СЃРµРв»-час СѻРІРёРґРёС‚ лишь то, что ожидает Сѻвидеть.