При создании сайта у начинающих веб-мастеров часто появляются вопросы: в какой кодировке делать сайт, чем отличается UTF-8 от windows-1251 и как ее прописывать в META Charset HTML-страницы сайта. Ответы на все эти вопросы в данной статье.
Кодировку можно представить в виде таблицы, состоящей из разных букв, цифр и других символов понятных человеку, которые закодированы определенным образом. Когда вы открываете текстовый файл, к которым относятся в том числе HTML-страницы, то компьютер считывает из заголовка файла в какой кодировке он был сохранен и выводит текст в соответствующей кодировке преобразовывая компьютерные данные в вид понятный человеку сопоставляя эти данные с таблицей кодировки. Если информация о кодировке из заголовка файла совпадает с кодировкой в которой сохранены данные в HTML-странице, то пользователь видит привычные ему буквы, цифры и другие символы. Если же есть несовпадение, то в результате пользователю выводится непонятный набор символов, особенно часто это происходит в старых почтовых программах. Если пользователь получил письмо с непонятными крякозябрами, то просто перебирая разные кодировки, обычно получается угадать и выбрать ту, в которой написано письмо, и в результате непонятный набор символов превращается в понятный человеку текст.
То же самое происходит и с HTML-страницами сайта. Если документ был сохранен, например, в кодировке UTF-8, а в самом документе прописан META-тег указывающий что это кодировка windows-1251, то браузер опять же будет сопоставлять сохраненные в файле данные с таблицей указанной ему кодировки и так как символы закодированы по-разному, то браузер выведет вместо привычного текста непонятный набор символов или же часть букв может быть в нормальном виде, а другие буквы или символы могут выводиться, например, в виде знаков вопроса. Все выше сказанное относится в том числе и к отображению имен файлов.
Создавая новый документ в текстовом редакторе лучше сразу убедиться что выбрана нужная кодировка. Современные редакторы позволяют преобразовать текст открытого документа из одной кодировки в другую, а стандартный Блокнот позволяет выбрать кодировку только при сохранении файла.
Из предыдущего пункта вы уже знаете что такое кодировка и почему настолько важно правильно прописать ее в коде страниц сайта. Давайте теперь выясним какую из множества кодировок лучше выбрать для будущего сайта. Поскольку самой распространенной и наиболее понятной в освоении всегда была операционная система Windows, то большинство веб-разработчиков создавали HTML-страницы в кодировке windows-1251 (ANSI), которая использовалась по-умолчанию. Но windows-1251 поддерживает не очень большое количество букв и символов, а разработчики хотят использовать в своих текстах различные стрелочки, сердечки, квадратики и другие символы, в том числе есть необходимость совмещать слова из разных языков в одном документе, поэтому на смену ей уже давно пришла более расширенная UTF-8 и большинство разработчиков используют именно эту кодировку.
Сайт, независимо от того является ли он просто набором статических HTML-документов или сложных динамических скриптов генерирующих страницы на лету, размещается на веб-сервере, который также работает с определенной кодировкой. И если сервер выдает информацию в одной кодировке, а ваши страницы или скрипты сохранены в другой кодировке, то опять же могут быть проблемы с отображением страниц в браузере пользователя. Многие хостинги позволяют менять настройки и выбрать кодировку в соответствии с той, которая используется в файлах сайта, через панель управления или же прописать ее в файле.htaccess, если на хостинге используется популярный веб-сервер Apache.
Практически ни один современный сайт не обходится без использования базы данных MySQL и она также может стать источником проблем с кодировкой. Если файлы сайта сохранены в одной кодировке, а информация в базе данных в другой, то на странице та часть информации, которая выводится из базы данных может отображаться в виде все тех же знаков вопросов или других непонятных символов. Чтобы избежать проблем с кодировкой она должна быть одинаковой для веб-сервера, базы данных MySQL, в скриптах, в HTML-страницах сайта и в META-теге, который прописывается в HTML-коде. Если есть проблемы с отображением текста, то проверяйте на наличие проблемы все выше перечисленное.
Чтобы сообщить браузеру и поисковым системам в какой кодировке сохранены страницы сайта в их коде прописывается META Charset.
Для кодировки windows-1251:
Текст страницы
Для кодировки UTF-8:
Текст страницы
Теперь вы знаете что такое кодировка сайта и где искать проблемы если в какой-либо части сайта неправильно отображается текст.
Копирование статьи запрещено.
Сегодня мы поговорим с вами про то, откуда берутся кракозябры на сайте и в программах, какие кодировки текста существуют и какие из них следует использовать. Подробно рассмотрим историю их развития, начиная от базовой ASCII, а также ее расширенных версий CP866, KOI8-R, Windows 1251 и заканчивая современными кодировками консорциума Юникод UTF 16 и 8. Оглавление: Кому-то эти сведения могут показаться излишними, но знали бы вы, сколько мне приходит вопросов именно касаемо вылезших кракозябров (не читаемого набора символов). Теперь у меня будет возможность отсылать всех к тексту этой статьи и самостоятельно отыскивать свои косяки. Ну что же, приготовьтесь впитывать информацию и постарайтесь следить за ходом повествования.
Часто в веб-программировании и вёрстке html-страниц приходится думать о кодировке редактируемого файла — ведь если кодировка выбрана неверная, то есть вероятность, что браузер не сможет автоматически её определить и в результате пользователь увидит т.н. «кракозябры» .
Возможно, вы сами видели на некоторых сайтах вместо нормального текста непонятные символы и знаки вопроса. Всё это возникает тогда, когда кодировка html-страницы и кодировка самого файла этой страницы не совпадают.
Вообще, что такое кодировка текста? Это просто набор символов, по-английски «charset » (character set). Нужна она для того, чтобы текстовую информацию преобразовывать в биты данных и передавать, например, через Интернет.
Собственно, основные параметры, которыми различаются кодировки — это количество байтов и набор спец.символов, в которые преобразуется каждый символ исходного текста.
Одной из первых для передачи цифровой информации стало появление кодировки ASCII — American Standard Code for Information Interchange — Американская стандартная кодировочная таблица, принятая Американским национальным институтом стандартов — American National Standards Institute (ANSI) .
В этих аббревиатурах можно запутаться Для практики же важно понимать, что исходная кодировка создаваемых текстовых файлов может не поддерживать все символы некоторых алфавитов (к примеру, иероглифы), потому идёт тенденция к переходу к т.н. стандарту Юникод (Unicode) , который поддерживает универсальные кодировки — Utf-8, Utf-16, Utf-32 и др.
Самая популярная из кодировок Юникода — кодировка Utf-8. Обычно в ней сейчас верстаются страницы сайтов и пишутся разные скрипты. Она позволяет без проблем отображать различные иероглифы, греческие буквы и прочие мыслимые и немыслимые символы (размер символа до 4-х байт). В частности, все файлы WordPress и Joomla пишутся именно в этой кодировке. А также некоторые веб-технологии (в частности, AJAX) способны нормально обрабатывать только символы utf-8.
Установка кодировок текстового файла при создании его обычным блокнотом. Кликабельно
В Рунете же ещё можно встретить сайты, написанные с расчётом на кодировку Windows-1251 (или cp-1251). Это специальная кодировка, предназначенная специально для кириллицы.
Привожу подробное описание кодировки UTF-8:
UTF-8
UTF-8 (от англ. Unicode Transformation Format, 8-bit - «формат преобразования Юникода, 8-битный») - одна из общепринятых и стандартизированных кодировок текста, которая позволяет хранить символы Юникода, используя переменное количество байт (от 1 до 6).
Стандарт UTF-8 официально закреплён в документах RFC 3629 и ISO/IEC 10646 Annex D. Кодировка нашла широкое применение в UNIX-подобных операционных системах и веб-пространстве.
Сам же формат UTF-8 был изобретён 2 сентября 1992 года Кеном Томпсоном и Робом Пайком и реализован в Plan 9. В качестве BOM использует последовательность байт EF 16 , BB 16 , BF 16 (что у неё самой является трёх-байтовой реализацией символа FEFF 16).
Одним из преимуществ является совместимость с ASCII - любые их 7-битные символы отображаются как есть, а остальные выдают пользователю мусор (шум).
Поэтому в случае, если латинские буквы и простейшие знаки препинания (включая пробел) занимают существенный объём текста, UTF-8 даёт выигрыш по объёму по сравнению с UTF-16.
- 1 Принцип кодирования
- 2 Конвертирование в UTF-8
- 2.1 UTF-32LE в UTF-8
- 2.2 UTF-32BE в UTF-8
- 3 Максимальный потенциал
- 3.1 Кодирование битовых цепочек
- 4 Диапазоны Unicode
- 5 Отличительные значения байтов
- 6 UTF-8 и ошибки кодирования/декодирования
- 7 Самосинхронизация и UTF-16
Принцип кодирования
Для номеров с U+0000 по U+007F кодировка UTF-8 полностью соответствует 7-битному US-ASCII c 0 в старшем бите и занимает один байт.
Алгоритм кодирования в UTF-8 стандартизирован в RFC 3629 и состоит из 3 пунктов:
1. Определить количество октетов (байт), требуемых для кодируемого номера символа в соответствии с таблицей:
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)
В таблице ниже значения представлены в шестнадцатеричной системе счисления. На практике для каждого значения выбирается единственное верное представление по алгоритму, стандартизированному в 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
Схемой можете воспользоваться при кодировании и раскодировании.
Эта схема сделана так, чтобы Вы видели какие биты куда попадают как при кодировании, так и раскодировании. По ней видно, что при этих обоих процессах просто нужные биты выставляются на нужные позиции при нужных значениях контрольных бит.
Можно заметить что компоновка в больших байтовых последовательностях осуществляется по 6 бит (в так называемых лидирующих байтах). При этом старшие биты предусматриваемого кода будут в первых байтах (схоже с порядком Big-Endian).
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 используются символы лишь до кода 0010FFFF 16 включительно. Поэтому даже 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, в том числе латинский алфавит, простейшие знаки препинания и арабские цифры 00000080 - 000007FF 2 байта кириллица, расширенная латиница, арабский, армянский, греческий, еврейский и коптский алфавит; сирийское письмо, тана, нко; МФА; некоторые знаки препинания 00000800 - 0000FFFF 3 байта все другие современные формы письменности, в том числе грузинский алфавит, индийское, китайское, корейское и японское письмо; сложные знаки препинания; математические и другие специальные символы 00010000 - 001FFFFF 4 байта музыкальные символы, смайлы, редкие китайские иероглифы, вымершие формы письменности, 00110000 - 001FFFFF не используется в Unicode 00200000 - 03FFFFFF 5 байт не используется в Unicode 04000000 - 7FFFFFFF 6 байт не используется в Unicode Отличительные значения байтов
Отличительные значения байтов представлены в первую очередь для использования в алгоритмах автоматического определения кодировки текста. Первичным признаком можно считать 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 в двоичной системе: 11111110 2 и 11111111 2 соответствуют длинам 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, которая уже обрабатывается 16-битными словами.
Возможно возникновение сомнения что UTF-16 не является самосинхронизирующейся. В настоящий момент передача данных в компьютере в подавляющем большинстве производится цельными октетами - 8 бит или ничего (см. IPv4, IPv6, SATA для современной аппаратуры и ATA с PATA для недавней).
В данных условиях UTF-8 имеет преимущество в характеристике самосинхронизации перед UTF-16, если речь касается аппаратной передачи данных или работы с байтовым потоком (чтение Unicode-данных с произвольной позиции).
Если же работа осуществляется в оперативной памяти одной машины, то UTF-16 так же является самосинхронизирующейся (если аппаратура способна подавать цельные 16-битные слова).
Приглашаю всех высказываться в
Юникод поддерживает практически все существующие наборы символов. Наилучшей формой кодирования набора символов Юникода является UTF-8-кодировка. В ней реализована совместимость с ASCII, устойчивость к искажению данных, эффективность и простота обработки. Но обо всём по порядку.
Компьютеры оперируют числами не просто как абстрактными математическими объектами, а как комбинациями единиц хранения и обработки информации фиксированного размера - байтов и 32-разрядных слов. Стандарт кодировки должен это учитывать при определении способа представления
В компьютерных системах целые числа хранятся в ячейках памяти размером 8 бит (1 байт), 16 или 32 бит. Каждая форма кодирования Юникода определяет, какая последовательность ячеек памяти представляет целое число, соответствующее конкретному символу. В стандарте представлены три различные формы кодирования символов Юникода: 8, 16 и 32-битными блоками. Соответственно, они носят название UTF-8, UTF-16 и UTF-32. Название UTF расшифровывается как формат преобразования Юникода. Каждая из трёх форм кодирования является равноправным средством представления символов Юникода, имеет преимущества в различных областях применения.
Данные кодировки могут быть использованы для представления всех символов стандарта Юникод. Таким образом, они полностью совместимы для решений, по разным причинам использующих разные формы кодирования. Каждая кодировка может быть однозначно преобразована в любую из двух других без потери данных.
Каждая из форм кодирования Юникода разработана с учётом недопустимости частичного наложения. Например, Windows-932 формирует символы из одного или двух байтов кода. Длина последовательности зависит от первого байта, поэтому значения лидирующего байта в последовательности из двух байтов и одиночного байта не пересекаются. Однако значения одиночного байта и замыкающего байта последовательности могут совпадать. Это означает, например, что при поиске символа D (код 44) можно ошибочно найти его входящим во вторую часть последовательности из двух байтов символа «Д» (код 84 44). Чтобы выяснить, какая последовательность является правильной, программа должна учесть предыдущие байты.
Ситуация усложнится, если ведущий и замыкающий байт совпадут. Это значит, что для снятия неоднозначности будет проводиться обратный поиск до достижения начала текста или однозначной последовательности кода. Это не только неэффективно, но не защищено от возможных ошибок, ведь достаточно одного неправильного байта, чтобы весь текст стал нечитабельным.
Формат преобразования Юникода позволяет избежать данной проблемы, потому что значения ведущей, замыкающей и одиночной единицы хранения информации не совпадают. Благодаря этому все кодировки Юникода подходят для поиска и сравнения, никогда не давая ошибочного результата из-за совпадения разных частей кода символов. Тот факт, что данные формы кодирования соблюдают принцип неналожения, отличает их от других многобайтовых восточноазиатских кодировок.
Другим аспектом непересечения является то, что каждый символ имеет чётко определяемые границы. При этом отпадает необходимость в сканировании неопределённого числа предыдущих символов. Данную особенность кодировок иногда называют самосинхронизацией. Искажение одной единицы кода введёт к искажению только одного символа, а окружающие символы остаются нетронутыми. В 8-битном формате преобразования, если указатель ссылается на байт, начинающийся с 10xxxxxx (в двоичной кодировке), для поиска начала символа потребуется от одного до трёх обратных переходов.
Консорциум Юникода в полной мере поддерживает все 3 формы кодировок. Важно не противопоставлять UTF-8 и Юникод, ведь все форматы преобразования - одинаково правомерные воплощения форм кодирования символов стандарта Юникод.
Для представления символа UTF-32 понадобится одна 32-битная единица кода, которая совпадает с кодом Юникода. UTF-16 - от одной до двух 16-битных единиц. А UTF-8 использует до 4 байт.
Кодировка UTF-8 создана для совместимости с байт-ориентированными системами на основе ASCII. Большая часть существующего программного обеспечения и практика информационных технологий длительное время опирались на представление символов в виде последовательности байтов. Множество протоколов зависит от неизменности и использует либо избегает специальные управляющие символы. Простым способом адаптировать Юникод к таким ситуациям можно, применив 8-битное кодирование для представления символов Юникода, эквивалентных любому или управляющему символу. Для этого и предназначена кодировка UTF-8.
UTF-8 - кодировка переменной длины, состоящая из 8-битных единиц хранения информации, старшие биты которых обозначают, к какой части последовательности относится каждый отдельный байт. Один диапазон значений отведён для первого элемента последовательности кода, другой - для последующих. Это обеспечивает непересекаемость кодировки.
UTF-8-кодировка полностью поддерживает коды ASCII (0x00-0x7F). Это значит, что символы Юникода U+0000-U+007F конвертируются в единственный байт 0x00-0x7F UTF-8 и таким образом становятся неотличимыми от ASCII. Более того, чтобы избежать многозначности, значения 0x00-0x7F не используются больше ни в одном байте представления символов Юникода. Для кодирования неидеографических символов, отличных от ASCII, используется последовательность из двух байтов. Символы диапазона U+0800-U+FFFF представлены тремя байтами, а дополнительные с кодами больше U+FFFF требуют четырёх байтов.
Кодировке UTF-8 обычно отдаётся предпочтение в протоколе HTML и ему подобным.
XML стал первым стандартом с полной поддержкой кодировки UTF-8. Организации, занимающиеся стандартизацией, тоже её рекомендуют. Проблема поддержки в адресах URL, отличных от ASCII-символов, была решена, когда консорциум W3С и инженерная группа IETF пришли к соглашению о кодировании всех исключительно в UTF-8.
Совместимость с ASCII облегчает переход к новому программному обеспечению. С UTF-8 работает большинство текстовых редакторов, в том числе JEdit, Emacs, BBEdit, Eclipse и "Блокнот" операционной системы Windows. Ни одна другая форма кодирования Юникода не может похвалиться такой поддержкой со стороны инструментальных средств.
Преимущество кодировки заключается в том, что она состоит из последовательности байтов. Со строками UTF-8 легко работать в C и других языках программирования. Это единственная форма кодирования, не требующая метки порядка байтов BOM или объявления кодировки в XML.
В окружении, использующем 8-битную обработку символов, по сравнению с другими многобайтными кодировками, UTF-8 обладает следующими преимуществами:
UTF-8-кодировка компактна. Но при применении для кодирования восточноазиатских символов (китайских, японских, корейских, использующих знаки китайского письма) используются 3-байтные последовательности. Также UTF-8-кодировка уступает другим формам кодирования по скорости обработки. А двоичная сортировка строк даёт тот же результат, что и двоичная сортировка Юникода.
Схема кодировки символов состоит из формы кодирования символов и способа побайтного расположения единиц кода. Для определения схемы кодирования стандартом Юникода предусмотрено использование начальной метки порядка байтов (BOM, Byte order mark).
При включении BOM в UTF-8 функция метки ограничивается только указанием на использование формы кодирования. Проблемы определения порядка байтов у UTF-8 нет, так как её размер единицы кодирования равен одному байту. Использование BOM для данной формы кодирования не является ни обязательным, ни рекомендуемым. BOM может встречаться в текстах, конвертированных из других кодировок, использующих метку порядка байтов, или для сигнатуры кодировки UTF-8. Представляет собой последовательность из 3 байтов EF 16 BB 16 BF 16 .
В UTF-8 устанавливается с помощью следующего кода:
˂meta http-equiv="Content-Type" content="text/html; charset=utf-8"˃
В PHP кодировка UTF-8 задаётся с помощью функции header() в самом начале файла после задания значения уровня вывода ошибок:
error_reporting(-1);
Charset=utf-8");
Для подключения к базам данных MySQL кодировка UTF-8 устанавливается так:
mysql_set_charset("utf8");
В CSS-файлах кодировка символов UTF-8 указывается так:
@charset "utf-8";
При сохранении файлов всех типов выбирается кодировка UTF-8 без BOM, иначе сайт работать не будет. Для этого в программе DreamWeave нужно выбрать пункт меню «Модификации - Свойства страницы - Заголовок/Кодировка», изменить кодировку на UTF-8. Затем следует перезагрузить страницу, убрать галочку из пункта «Подключить Юникод сигнатуры (BOM)» и применить изменения. Если какой-либо текст на странице или в базе данных был введён другой формой кодирования, то его нужно ввести заново или перекодировать. При работе с регулярными выражениями обязательно использовать модификатор u.
В текстовом редакторе Notepad++, если кодировка отлична от UTF-8, через пункт меню «Преобразовать в UTF-8 без BOM» изменить кодировку и сохранить в кодировке UTF-8.
В условиях глобализации, когда политические и языковые границы стираются, наборы символов, которые имеют местные особенности, становятся малопригодными. Юникод является единственным набором символов с поддержкой всех локализаций. А UTF-8 - пример правильной реализации Юникода, которая:
С появлением UTF-8 дискуссии о том, какая форма кодирования или набор символов лучше, стали бессмысленны.