Что такое код utf8_encode


Содержание

utf8_encode

(PHP 3>= 3.0.6, PHP 4)

utf8_encode — кодирует строку ISO-8859-1 в UTF-8.

Описание

string utf8_encode (string data)

Эта функция кодирует строку data в UTF-8 и возвращает кодированную версию. UTF-8 это стандартный механизм Unicode для кодирования wide character-значений в байтовый поток. UTF-8 прозрачна для обычных ASCII-символов, самосинхронизируется (т.е. программа может указать, где начинаются символы байтового потока) и может использоваться с функциями сравнения нормальных строк для сортировки их как таковых. PHP кодирует UTF-8 символы в блоки до 4 байтов, как здесь:

Таблица 1. Кодирование UTF-8
байтов битов представление
1 7 0bbbbbbb
2 11 110bbbbb 10bbbbbb
3 16 1110bbbb 10bbbbbb 10bbbbbb
4 21 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb

Каждый b представляет бит, который может использоваться для хранения данных символа.

utf8_encode — Кодирует строку ISO-8859-1 в кодировке UTF-8

(PHP 4, PHP 5, PHP 7)

utf8_encode — Кодирует строку ISO-8859-1 в кодировке UTF-8

Описание

Эта функция кодирует строку data кодировкой UTF-8, и возвращает закодированный вариант. UTF-8 — стандартный механизм, используемый в Unicode для кодирования wide character значений в поток байтов. UTF-8 не оказывает влияния на незашифрованные ASCII символы, он самосинхронизирующийся (это значит, что программно можно вычислить, где в потоке байт начинаются символы) и может использоваться функциями сравнения строк для сортировки и подобных задач. PHP кодирует UTF-8 символы в 4 байта, как показано ниже:

UTF-8 encoding
байты биты представление
1 7 0bbbbbbb
2 11 110bbbbb 10bbbbbb
3 16 1110bbbb 10bbbbbb 10bbbbbb
4 21 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb

Каждая b представляет бит, который может быть использован для хранения данных символа.

Список параметров

Возвращаемые значения

Возвращает UTF-8 перевод данных data .

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

  • utf8_decode() — Преобразует строку с ISO-8859-1 символами кодированную в UTF-8 в однобайтную ISO-8859-1

Кодировка текста ASCII (Windows 1251, CP866, KOI8-R) и Юникод (UTF 8, 16, 32) — как исправить проблему с кракозябрами

Здравствуйте, уважаемые читатели блога KtoNaNovenkogo.ru. Сегодня мы поговорим с вами про то, откуда берутся кракозябры на сайте и в программах, какие кодировки текста существуют и какие из них следует использовать. Подробно рассмотрим историю их развития, начиная от базовой ASCII, а также ее расширенных версий CP866, KOI8-R, Windows 1251 и заканчивая современными кодировками консорциума Юникод UTF 16 и 8.

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

ASCII — базовая кодировка текста для латиницы

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

Но все же отправной точкой для развития современных кодировок текстов стоит считать знаменитую ASCII (American Standard Code for Information Interchange, которая по-русски обычно произносится как «аски»). Она описывает первые 128 символов из наиболее часто используемых англоязычными пользователями — латинские буквы, арабские цифры и знаки препинания.

Еще в эти 128 знаков, описанных в ASCII, попадали некоторые служебные символы навроде скобок, решеток, звездочек и т.п. Собственно, вы сами можете увидеть их:

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

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

Тут, наверное, стоит еще немного сказать про системы счисления, которые используются при описании. Во-первых, как вы все знаете, компьютер работает только с числами в двоичной системе, а именно с нулями и единицами («булева алгебра», если кто проходил в институте или в школе). Один байт состоит из восьми бит, каждый из которых представляет из себя двойку в степени, начиная с нулевой, и до двойки в седьмой:

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

В нашем примере это получается 1 (2 в степени ноль) плюс 8 (два в степени 3), плюс 32 (двойка в пятой степени), плюс 64 (в шестой), плюс 128 (в седьмой). Итого получает 233 в десятичной системе счисления. Как видите, все очень просто.

Но если вы присмотритесь к таблице с символами ASCII, то увидите, что они представлены в шестнадцатеричной кодировке. Например, «звездочка» соответствует в Аски шестнадцатеричному числу 2A. Наверное, вам известно, что в шестнадцатеричной системе счисления используются кроме арабских цифр еще и латинские буквы от A (означает десять) до F (означает пятнадцать).

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

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

Расширенные версии Аски — кодировки CP866 и KOI8-R с псевдографикой

Итак, мы с вами начали говорить про ASCII, которая являлась как бы отправной точкой для развития всех современных кодировок (Windows 1251, юникод, UTF 8).

Изначально в нее было заложено только 128 знаков латинского алфавита, арабских цифр и еще чего-то там, но в расширенной версии появилась возможность использовать все 256 значений, которые можно закодировать в одном байте информации. Т.е. появилась возможность добавить в Аски символы букв своего языка.

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

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

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

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

Например, изначально появилась CP866, в которой была возможность использовать символы русского алфавита и она являлась расширенной версией ASCII.

Т.е. ее верхняя часть полностью совпадала с базовой версией Аски (128 символов латиницы, цифр и еще всякой лабуды), которая представлена на приведенном чуть выше скриншоте, а вот уже нижняя часть таблицы с кодировкой CP866 имела указанный на скриншоте чуть ниже вид и позволяла закодировать еще 128 знаков (русские буквы и всякая там псевдографика):

Видите, в правом столбце цифры начинаются с 8, т.к. числа с 0 до 7 относятся к базовой части ASCII (см. первый скриншот). Т.о. русская буква «М» в CP866 будет иметь код 9С (она находится на пересечении соответствующих строки с 9 и столбца с цифрой С в шестнадцатеричной системе счисления), который можно записать в одном байте информации, и при наличии подходящего шрифта с русскими символами эта буква без проблем отобразится в тексте.

Откуда взялось такое количество псевдографики в CP866? Тут все дело в том, что эта кодировка для русского текста разрабатывалась еще в те мохнатые года, когда не было такого распространения графических операционных систем как сейчас. А в Досе, и подобных ей текстовых операционках, псевдографика позволяла хоть как-то разнообразить оформление текстов и поэтому ею изобилует CP866 и все другие ее ровесницы из разряда расширенных версий Аски.

CP866 распространяла компания IBM, но кроме этого для символов русского языка были разработаны еще ряд кодировок, например, к этому же типу (расширенных ASCII) можно отнести KOI8-R:

Принцип ее работы остался тот же самый, что и у описанной чуть ранее CP866 — каждый символ текста кодируется одним единственным байтом. На скриншоте показана вторая половина таблицы KOI8-R, т.к. первая половина полностью соответствует базовой Аски, которая показана на первом скриншоте в этой статье.

Среди особенностей кодировки KOI8-R можно отметить то, что русские буквы в ее таблице идут не в алфавитном порядке, как это, например, сделали в CP866.

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

Windows 1251 — современная версия ASCII и почему вылезают кракозябры

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

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

Она выгодно отличалась от используемых ранее CP866 и KOI8-R тем, что место символов псевдографики в ней заняли недостающие символы русской типографики (окромя знака ударения), а также символы, используемые в близких к русскому славянских языках (украинскому, белорусскому и т.д.):

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

Очень часто они вылезали при отправке и получении сообщений по электронной почте, что повлекло за собой создание очень сложных перекодировочных таблиц, которые, собственно, решить эту проблему в корне не смогли, и зачастую пользователи для переписки использовали транслит латинских букв, чтобы избежать пресловутых кракозябров при использовании русских кодировок подобных CP866, KOI8-R или Windows 1251.

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

Допустим, если символы, закодированные с помощью CP866, попробовать отобразить, используя кодовую таблицу Windows 1251, то эти самые кракозябры (бессмысленный набор знаков) и вылезут, полностью заменив собой текст сообщения.

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

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

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

Эти тысячи знаков языковой группы юго-восточной Азии никак невозможно было описать в одном байте информации, который выделялся для кодирования символов в расширенных версиях ASCII. В результате был создан консорциум под названием Юникод (Unicode — Unicode Consortium) при сотрудничестве многих лидеров IT индустрии (те, кто производит софт, кто кодирует железо, кто создает шрифты), которые были заинтересованы в появлении универсальной кодировки текста.

Первой вариацией, вышедшей под эгидой консорциума Юникод, была UTF 32. Цифра в названии кодировки означает количество бит, которое используется для кодирования одного символа. 32 бита составляют 4 байта информации, которые понадобятся для кодирования одного единственного знака в новой универсальной кодировке UTF.

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

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

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

В операционной системе Windows вы можете пройти по пути «Пуск» — «Программы» — «Стандартные» — «Служебные» — «Таблица символов». В результате откроется таблица с векторными формами всех установленных у вас в системе шрифтов. Если вы выберете в «Дополнительных параметрах» набор знаков Юникод, то сможете увидеть для каждого шрифта в отдельности весь ассортимент входящих в него символов.

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

Сколько символов можно закодировать в UTF-16 с помощью 16 бит? 65 536 (два в степени шестнадцать), и именно это число было принято за базовое пространство в Юникоде. Помимо этого существуют способы закодировать с помощью нее и около двух миллионов знаков, но ограничились расширенным пространством в миллион символов текста.

Но даже эта удачная версия кодировки Юникода не принесла особого удовлетворения тем, кто писал, допустим, программы только на английском языке, ибо у них, после перехода от расширенной версии ASCII к UTF-16, вес документов увеличивался в два раза (один байт на один символ в Аски и два байта на тот же самый символ в ЮТФ-16).

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

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

Что примечательно, в случае кодирования только латиницы, даже те программы, которые не понимают Юникод, все равно прочитают то, что закодировано в ЮТФ-8. Т.е. базовая часть Аски просто перешла в это детище консорциума Unicode.

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

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

Кракозябры вместо русских букв — как исправить

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

Для редактирования и создания текстовых файлов лично я использую очень хороший, на мой взгляд, Html и PHP редактор Notepad++. Впрочем, он может подсвечивать синтаксис еще доброй сотни языков программирования и разметки, а также имеет возможность расширения с помощью плагинов. Читайте подробный обзор этой замечательной программы по приведенной ссылке.

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

В случае сайта на Joomla 1.5 и выше, а также в случае блога на WordPress следует во избежании появления кракозябров выбирать вариант UTF 8 без BOM. А что такое приставка BOM?

Дело в том, что когда разрабатывали кодировку ЮТФ-16, зачем-то решили прикрутить к ней такую вещь, как возможность записывать код символа, как в прямой последовательности (например, 0A15), так и в обратной (150A). А для того, чтобы программы понимали, в какой именно последовательности читать коды, и был придуман BOM (Byte Order Mark или, другими словами, сигнатура), которая выражалась в добавлении трех дополнительных байтов в самое начало документов.

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

Что примечательно, некоторые программы в Windows не умеют этого делать (не умеют сохранять текст в ЮТФ-8 без BOM), например, все тот же пресловутый Блокнот Windows. Он сохраняет документ в UTF-8, но все равно добавляет в его начало сигнатуру (три дополнительных байта). Причем эти байты будут всегда одни и те же — читать код в прямой последовательности. Но на серверах из-за этой мелочи может возникнуть проблема — вылезут кракозябры.

Поэтому ни в коем случае не пользуйтесь обычным блокнотом Windows для редактирования документов вашего сайта, если не хотите появления кракозябров. Лучшим и наиболее простым вариантом я считаю уже упомянутый редактор Notepad++, который практически не имеет недостатков и состоит из одних лишь достоинств.

В Notepad ++ при выборе кодировки у вас будет возможность преобразовать текст в кодировку UCS-2, которая по своей сути очень близка к стандарту Юникод. Также в Нотепаде можно будет закодировать текст в ANSI, т.е. применительно к русскому языку это будет уже описанная нами чуть выше Windows 1251. Откуда берется эта информация?

Она прописана в реестре вашей операционной системы Windows — какую кодировку выбирать в случае ANSI, какую выбирать в случае OEM (для русского языка это будет CP866). Если вы установите на своем компьютере другой язык по умолчанию, то и эти кодировки будут заменены на аналогичные из разряда ANSI или OEM для того самого языка.

После того, как вы в Notepad++ сохраните документ в нужной вам кодировке или же откроете документ с сайта для редактирования, то в правом нижнем углу редактора сможете увидеть ее название:

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

Вообще, во всех языках гипертекстовой разметки кроме Html используется специальное объявление xml, в котором указывается кодировка текста.

Прежде, чем начать разбирать код, браузер узнает, какая версия используется и как именно нужно интерпретировать коды символов этого языка. Но что примечательно, в случае, если вы сохраняете документ в принятом по умолчанию юникоде, то это объявление xml можно будет опустить (кодировка будет считаться UTF-8, если нет BOM или ЮТФ-16, если BOM есть).

В случае же документа языка Html для указания кодировки используется элемент Meta, который прописывается между открывающим и закрывающим тегом Head:

Эта запись довольно сильно отличается от принятой в стандарте в Html 4.01, но полностью соответствует новому внедряемому потихоньку стандарту Html 5, и она будет стопроцентно правильно понята любыми используемыми на текущий момент браузерами.

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

High Star

Уроки веб-мастеру

Как самому с нуля сделать сайт? Здесь даны основы сайтостроения, которых еще никто не отменял. Как пользоваться такими программами, как PhotoShop, ImageReady и другими. Полезные советы вебмастерам.

Как перевести файлы в кодировку UTF-8

Те, у кого старые сайты, могут столкнуться с такой проблемой, что необходимо перевести файлы в кодировку UTF-8. К их числу я смело могу назвать и себя. Начала делать сайты более 10 лет назад, когда об этой кодировке было мало что известно. На всех страницах у меня стояла кодировка:

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

Сейчас уже так не пишут. На смену старому пришло новое — HTML5, где нужно прописать:

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

  1. Открывала файл в Notepad++
  2. Выделяла весть текст
  3. Копировала весь текст
  4. Переводила кодировку в UTF-8
  5. Вставляла текст
  6. Проверяла опять — в той ли кодировке стоит?
  7. Сохраняла файл

И вот два дня я так долбила один свой сайт.

Можно, конечно же и не менять ничего. Но ведь старые сайты мои давно устарели, нужно переводить их и на современную верстку HTML5 и CSS3, плюс мобильную и адаптивную верстку. И лучше это делать в более продвинутых программах, а не в Notepad++.

Короче, приуныла я. Однако приехал сын-программист и все решил!

Оказывается все уже давно придумано. И если у Вас возникла такая же проблема — не отчаивайтесь! Есть прекрасная программа UTFCast Express

Эту программу можно скачать тут — http://www.rotatingscrew.com/utfcast-express.aspx — Это условно бесплатная программа, которая умеет конвертировать текст из разных кодировок в utf8. Доступна для ОС семейства Windows.

Запускаем UTFCast Express и указываем правильные пути: сверху — что конвертировать, снизу — куда складывать конвертированные файлы. Вам нужно просто выбрать нужные директории, программа сама перекодирует все нужные файлы из папки. Нажимаем «Start».

Единственно, заранее создайте новую папку, куда программа закачает все Ваши файлы из нужной папки.

Не забудьте также поставить галочку «Copy Unconverted». Нажимаете кнопочку «Start» и программа заработала!

Всего пара минут и все файлы волшебным образом перекодировались в нужную кодировочку!

Папку с прежними файлами можете просто удалить, чтобы не занимала место и работать дальше! Вперед, к новым высотам!

Что такое вообще UTF-8

Заметьте, что UTF-8 надо обязательно писать в верхнем регистре и через черточку, то есть никаких там utf-8, utf8 или UTF8. Пишите правильно!

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 использует последовательность байт EF16, BB16, BF16 (что у неё самой является трёхбайтовой реализацией символа FEFF16).

Одним из преимуществ является совместимость с ASCII — любые их 7-битные символы отображаются как есть, а остальные выдают пользователю мусор (шум). Поэтому в случае, если латинские буквы и простейшие знаки препинания (включая пробел) занимают существенный объём текста, UTF-8 даёт выигрыш по объёму по сравнению с UTF-16.

utf8_encode

(PHP 4, PHP 5, PHP 7)

utf8_encode — Кодирует строку ISO-8859-1 в кодировке UTF-8

Описание

Эта функция конвертирует строку data из кодировки ISO-8859-1 в UTF-8

Многие веб-страницы, отмеченые как использующие кодировку ISO-8859-1, на самом деле используют схожую кодировку Windows-1252, и веб-браузеры интерпретируют страницы ISO-8859-1 как Windows-1252. Однако Windows-1252 содержит дополнительные печатные символы, такие как знак Евро () и фигурные кавычки ( ) вместо управляющих кодов ISO-8859-1. Эта функция не конвертирует такие символы Windows-1252 корректно. Используйте другую функцию, если нужна конвертация из Windows-1252.

Список параметров

Возвращаемые значения

Возвращает UTF-8 перевод данных data .

Список изменений

Версия Описание
7.2.0 Эта функция была перенесена в ядро PHP, таким образом отменив требование расширения XML для использования этой функции.

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

  • utf8_encode() (содержит описание UTF-8)
  • mb_convert_encoding() — Преобразует кодировку символов — Конвертирует между множеством различных кодировок, включая UTF-8, ISO-8859-1 and Windows-1252
  • iconv() — Преобразование строки в требуемую кодировку — Конвертирует между множеством различных кодировок
  • recode_string() — Перекодирует строку в соответствие с заданными параметрами — Конвертирует между множеством различных кодировок

User Contributed Notes 42 notes

Please note that utf8_encode only converts a string encoded in ISO-8859-1 to UTF-8. A more appropriate name for it would be «iso88591_to_utf8». If your text is not encoded in ISO-8859-1, you do not need this function. If your text is already in UTF-8, you do not need this function. In fact, applying this function to text that is not encoded in ISO-8859-1 will most likely simply garble that text.

If you need to convert text from any encoding to any other encoding, look at iconv() instead.

For reference, it may be insightful to point out that:
utf8_encode($s)
is actually identical to:
recode_string(‘latin1..utf8’, $s)
and:
iconv(‘iso-8859-1’, ‘utf-8’, $s)
That is, utf8_encode is a specialized case of character set conversions.

If your string to be converted to utf-8 is something other than iso-8859-1 (such as iso-8859-2 (Polish/Croatian)), you should use recode_string() or iconv() instead rather than trying to devise complex str_replace statements.

If you need a function which converts a string array into a utf8 encoded string array then this function might be useful for you:

Walk through nested arrays/objects and utf8 encode all strings.

// Usage
class Foo <
public $somevar = ‘whoop whoop’ ;
>

$structure = array(
‘object’ => (object) array(
‘entry’ => ‘hello wörld’ ,
‘another_array’ => array(
‘string’ ,
1234 ,
‘another string’
)
),
‘string’ => ‘foo’ ,
‘foo_object’ => new Foo
);

// $structure is now utf8 encoded
print_r ( $structure );

unset( $value );
> else if ( is_object ( $input )) <
$vars = array_keys ( get_object_vars ( $input ));

foreach ( $vars as $var ) <
utf8_encode_deep ( $input -> $var );
>
>
>
?>

Here’s some code that addresses the issue that Steven describes in the previous comment;

/* This structure encodes the difference between ISO-8859-1 and Windows-1252,
as a map from the UTF-8 encoding of some ISO-8859-1 control characters to
the UTF-8 encoding of the non-control characters that Windows-1252 places
at the equivalent code points. */

$cp1252_map = array(
«\xc2\x80» => «\xe2\x82\xac» , /* EURO SIGN */
«\xc2\x82» => «\xe2\x80\x9a» , /* SINGLE LOW-9 QUOTATION MARK */
«\xc2\x83» => «\xc6\x92» , /* LATIN SMALL LETTER F WITH HOOK */
«\xc2\x84» => «\xe2\x80\x9e» , /* DOUBLE LOW-9 QUOTATION MARK */
«\xc2\x85» => «\xe2\x80\xa6» , /* HORIZONTAL ELLIPSIS */
«\xc2\x86» => «\xe2\x80\xa0» , /* DAGGER */
«\xc2\x87» => «\xe2\x80\xa1» , /* DOUBLE DAGGER */
«\xc2\x88» => «\xcb\x86» , /* MODIFIER LETTER CIRCUMFLEX ACCENT */
«\xc2\x89» => «\xe2\x80\xb0» , /* PER MILLE SIGN */
«\xc2\x8a» => «\xc5\xa0» , /* LATIN CAPITAL LETTER S WITH CARON */
«\xc2\x8b» => «\xe2\x80\xb9» , /* SINGLE LEFT-POINTING ANGLE QUOTATION */
«\xc2\x8c» => «\xc5\x92» , /* LATIN CAPITAL LIGATURE OE */
«\xc2\x8e» => «\xc5\xbd» , /* LATIN CAPITAL LETTER Z WITH CARON */
«\xc2\x91» => «\xe2\x80\x98» , /* LEFT SINGLE QUOTATION MARK */
«\xc2\x92» => «\xe2\x80\x99» , /* RIGHT SINGLE QUOTATION MARK */
«\xc2\x93» => «\xe2\x80\x9c» , /* LEFT DOUBLE QUOTATION MARK */
«\xc2\x94» => «\xe2\x80\x9d» , /* RIGHT DOUBLE QUOTATION MARK */
«\xc2\x95» => «\xe2\x80\xa2» , /* BULLET */
«\xc2\x96» => «\xe2\x80\x93» , /* EN DASH */
«\xc2\x97» => «\xe2\x80\x94» , /* EM DASH */

«\xc2\x98» => «\xcb\x9c» , /* SMALL TILDE */
«\xc2\x99» => «\xe2\x84\xa2» , /* TRADE MARK SIGN */
«\xc2\x9a» => «\xc5\xa1» , /* LATIN SMALL LETTER S WITH CARON */
«\xc2\x9b» => «\xe2\x80\xba» , /* SINGLE RIGHT-POINTING ANGLE QUOTATION*/
«\xc2\x9c» => «\xc5\x93» , /* LATIN SMALL LIGATURE OE */
«\xc2\x9e» => «\xc5\xbe» , /* LATIN SMALL LETTER Z WITH CARON */
«\xc2\x9f» => «\xc5\xb8» /* LATIN CAPITAL LETTER Y WITH DIAERESIS*/
);

function cp1252_to_utf8 ( $str ) <
global $cp1252_map ;
return strtr ( utf8_encode ( $str ), $cp1252_map );
>

I tried a lot of things, but this seems to be the final fail save method to convert any string to proper UTF-8.

function _convert ( $content ) <
if(! mb_check_encoding ( $content , ‘UTF-8’ )
OR !( $content === mb_convert_encoding ( mb_convert_encoding ( $content , ‘UTF-32’ , ‘UTF-8’ ), ‘UTF-8’ , ‘UTF-32’ ))) <

$content = mb_convert_encoding ( $content , ‘UTF-8’ );

if ( mb_check_encoding ( $content , ‘UTF-8’ )) <
// log(‘Converted to UTF-8’);
> else <
// log(‘Could not converted to UTF-8’);
>
>
return $content ;
>
?>

I recommend using this alternative for every language:

Don’t forget to set all your pages to «utf-8» encoding, otherwise just use HTML entities.

This function may be useful do encode array keys and values [and checks first to see if it’s already in UTF format]:

public static function to_utf8 ( $in )
<
if ( is_array ( $in )) <
foreach ( $in as $key => $value ) <
$out [ to_utf8 ( $key )] = to_utf8 ( $value );
>
> elseif( is_string ( $in )) <
if( mb_detect_encoding ( $in ) != «UTF-8» )
return utf8_encode ( $in );
else
return $in ;
> else <
return $in ;
>
return $out ;
>
?>

Hope this may help.

[NOTE BY danbrown AT php DOT net: Original function written by (cmyk777 AT gmail DOT com) on 28-JAN-09.]

If you are looking for a function to replace special characters with the hex-utf-8 value (e.g. für Webservice-Security/WSS4J compliancy) you might use this:

$textstart = «Größe»;
$utf8 =»;
$max = strlen($txt);

$utf8 .= $neu;
> // for $i

In this example $textnew will be «Größe»

// Reads a file story.txt ascii (as typed on keyboard)
// converts it to Georgian character using utf8 encoding
// if I am correct(?) just as it should be when typed on Georgian computer
// it outputs it as an html file
//
// http://www.comweb.nl/keys_to_georgian.html
// http://www.comweb.nl/keys_to_georgian.php
// http://www.comweb.nl/story.txt

keys to unicode code

// this meta tag is needed

// note the sylfean font seems to be standard installed on Windows XP
// It supports Georgian

My version of utf8_encode_deep,
In case you need one that returns a value without changing the original.

/**
* Convert Anything To UTF-8
* @param mixed $var The variable you want to convert.
* @param boolean $deep Deep convertion? (*Default: TRUE).
* @return mixed
*/
function anything_to_utf8($var,$deep=TRUE) <
if(is_array($var)) <
foreach($var as $key => $value) <
if($deep) <
$var[$key] = anything_to_utf8($value,$deep);
>elseif(!is_array($value) && !is_object($value) && !mb_detect_encoding($value,’utf-8′,true)) <
$var[$key] = utf8_encode($var);
>
>
return $var;
>elseif(is_object($var)) <
foreach($var as $key => $value) <
if($deep) <
$var->$key = anything_to_utf8($value,$deep);
>elseif(!is_array($value) && !is_object($value) && !mb_detect_encoding($value,’utf-8′,true)) <
$var->$key = utf8_encode($var);
>
>
return $var;
>else <
return (!mb_detect_encoding($var,’utf-8′,true))?utf8_encode($var):$var;
>
>

Avoiding use of preg_match to detect if utf8_encode is needed:

= $string_input ; // avoid being destructive

$string = preg_replace ( «#[\x09\x0A\x0D\x20-\x7E]#» , «» , $string ); // ASCII
$string = preg_replace ( «#[\xC2-\xDF][\x80-\xBF]#» , «» , $string ); // non-overlong 2-byte
$string = preg_replace ( «#\xE0[\xA0-\xBF][\x80-\xBF]#» , «» , $string ); // excluding overlongs
$string = preg_replace ( «#[\xE1-\xEC\xEE\xEF][\x80-\xBF]<2>#» , «» , $string ); // straight 3-byte
$string = preg_replace ( «#\xED[\x80-\x9F][\x80-\xBF]#» , «» , $string ); // excluding surrogates
$string = preg_replace ( «#\xF0[\x90-\xBF][\x80-\xBF]<2>#» , «» , $string ); // planes 1-3
$string = preg_replace ( «#[\xF1-\xF3][\x80-\xBF]<3>#» , «» , $string ); // planes 4-15
$string = preg_replace ( «#\xF4[\x80-\x8F][\x80-\xBF]<2>#» , «» , $string ); // plane 16

$rc = ( $string == «» ? true : false );
?>

/**
* Encodes an ISO-8859-1 mixed variable to UTF-8 (PHP 4, PHP 5 compat)
* @param mixed $input An array, associative or simple
* @param boolean $encode_keys optional
* @return mixed ( utf-8 encoded $input)
*/

function utf8_encode_mix ( $input , $encode_keys = false )
<
if( is_array ( $input ))
<
$result = array();
foreach( $input as $k => $v )
<
$key = ( $encode_keys )? utf8_encode ( $k ) : $k ;
$result [ $key ] = utf8_encode_mix ( $v , $encode_keys );
>
>
else
<
$result = utf8_encode ( $input );
>

/*
Every function seen so far is incomplete or resource consumpting. Here are two — integer 2 utf sequence (i3u) and utf sequence to integer (u3i). Below is a code snippet that checks well behavior at the range boundaries.

Someday they might be hardcoded into PHP.
*/

function u3i($s,$strict=1) < // returns integer on valid UTF-8 seq, NULL on empty, else FALSE
// NOT strict: takes only DATA bits, present or not; strict: length and bits checking
if ($s==») return NULL;
$l=strlen($s); $o=ord($s<0>);
if ($o 6 && $strict) return false;
if ($strict) for ($i=1;$i 0xbf || ord($s<$i>) [» . u3i($o) . «]\n»;
>

I had some difficulty finding a way to easily write UTF-8 files with the byte order mark included. This is the simple solution I have come up with:

function writeUTF8File ( $filename , $content ) <
$dhandle = fopen ( $filename , «w» );
# Now UTF-8 — Add byte order mark
fwrite ( $dhandle , pack ( «CCC» , 0xef , 0xbb , 0xbf ));
fwrite ( $dhandle , $content );
fclose ( $dhandle );
>
?>

When you read the file back in using fopen, the BOM will also be there. To remove it, I also wrote the following function:

function removeBOM ( $str = «» ) <
if( substr ( $str , 0 , 3 ) == pack ( «CCC» , 0xef , 0xbb , 0xbf )) <
$str = substr ( $str , 3 );
>
return $str ;
>
?>

I was searching for a function similar to Javascript’s unescape(). In most cases it is OK to use url_decode() function but not if you’ve got UTF characters in the strings. They are converted into %uXXXX entities that url_decode() cannot handle.
I googled the net and found a function which actualy converts these entities into HTML entities (&#xxx;) that your browser can show correctly. If you’re OK with that, the function can be found here: http://pure-essence.net/stuff/code/utf8RawUrlDecode.phps

But it was not OK with me because I needed a string in my charset to make some comparations and other stuff. So I have modified the above function and in conjuction with code2utf() function mentioned in some other note here, I have managed to achieve my goal:

/**
* Function converts an Javascript escaped string back into a string with specified charset (default is UTF-8).
* Modified function from http://pure-essence.net/stuff/code/utf8RawUrlDecode.phps
*
* @param string $source escaped with Javascript’s escape() function
* @param string $iconv_to destination character set will be used as second paramether in the iconv function. Default is UTF-8.
* @return string
*/
function unescape ( $source , $iconv_to = ‘UTF-8’ ) <
$decodedStr = » ;
$pos = 0 ;
$len = strlen ( $source );
while ( $pos $len ) <
$charAt = substr ( $source , $pos , 1 );
if ( $charAt == ‘%’ ) <
$pos ++;
$charAt = substr ( $source , $pos , 1 );
if ( $charAt == ‘u’ ) <
// we got a unicode character
$pos ++;
$unicodeHexVal = substr ( $source , $pos , 4 );
$unicode = hexdec ( $unicodeHexVal );
$decodedStr .= code2utf ( $unicode );
$pos += 4 ;
>
else <
// we have an escaped ascii character
$hexVal = substr ( $source , $pos , 2 );
$decodedStr .= chr ( hexdec ( $hexVal ));
$pos += 2 ;
>
>
else <
$decodedStr .= $charAt ;
$pos ++;
>
>

if ( $iconv_to != «UTF-8» ) <
$decodedStr = iconv ( «UTF-8» , $iconv_to , $decodedStr );
>

/**
* Function coverts number of utf char into that character.
* Function taken from: http://sk2.php.net/manual/en/function.utf8-encode.php#49336
*
* @param int $num
* @return utf8char
*/
function code2utf ( $num ) <
if( $num 128 )return chr ( $num );
if( $num 2048 )return chr (( $num >> 6 )+ 192 ). chr (( $num & 63 )+ 128 );
if( $num 65536 )return chr (( $num >> 12 )+ 224 ). chr ((( $num >> 6 )& 63 )+ 128 ). chr (( $num & 63 )+ 128 );
if( $num 2097152 )return chr (( $num >> 18 )+ 240 ). chr ((( $num >> 12 )& 63 )+ 128 ). chr ((( $num >> 6 )& 63 )+ 128 ) . chr (( $num & 63 )+ 128 );
return » ;
>
?>

This function I use convert Thai font (iso-8859-11) to UTF-8. For my case, It work properly. Please try to use this function if you have a problem to convert charset iso-8859-11 to UTF-8.

if ( ! ereg(«[\241-\377]», $string) )
return $string;

$iso8859_11 = array(
«\xa1» => «\xe0\xb8\x81»,
«\xa2» => «\xe0\xb8\x82»,
«\xa3» => «\xe0\xb8\x83»,
«\xa4» => «\xe0\xb8\x84»,
«\xa5» => «\xe0\xb8\x85»,
«\xa6» => «\xe0\xb8\x86»,
«\xa7» => «\xe0\xb8\x87»,
«\xa8» => «\xe0\xb8\x88»,
«\xa9» => «\xe0\xb8\x89»,
«\xaa» => «\xe0\xb8\x8a»,
«\xab» => «\xe0\xb8\x8b»,
«\xac» => «\xe0\xb8\x8c»,
«\xad» => «\xe0\xb8\x8d»,
«\xae» => «\xe0\xb8\x8e»,
«\xaf» => «\xe0\xb8\x8f»,
«\xb0» => «\xe0\xb8\x90»,
«\xb1» => «\xe0\xb8\x91»,
«\xb2» => «\xe0\xb8\x92»,
«\xb3» => «\xe0\xb8\x93»,
«\xb4» => «\xe0\xb8\x94»,
«\xb5» => «\xe0\xb8\x95»,
«\xb6» => «\xe0\xb8\x96»,
«\xb7» => «\xe0\xb8\x97»,
«\xb8» => «\xe0\xb8\x98»,
«\xb9» => «\xe0\xb8\x99»,
«\xba» => «\xe0\xb8\x9a»,
«\xbb» => «\xe0\xb8\x9b»,
«\xbc» => «\xe0\xb8\x9c»,
«\xbd» => «\xe0\xb8\x9d»,
«\xbe» => «\xe0\xb8\x9e»,
«\xbf» => «\xe0\xb8\x9f»,
«\xc0» => «\xe0\xb8\xa0»,
«\xc1» => «\xe0\xb8\xa1»,
«\xc2» => «\xe0\xb8\xa2»,
«\xc3» => «\xe0\xb8\xa3»,
«\xc4» => «\xe0\xb8\xa4»,
«\xc5» => «\xe0\xb8\xa5»,
«\xc6» => «\xe0\xb8\xa6»,
«\xc7» => «\xe0\xb8\xa7»,
«\xc8» => «\xe0\xb8\xa8»,
«\xc9» => «\xe0\xb8\xa9»,
«\xca» => «\xe0\xb8\xaa»,
«\xcb» => «\xe0\xb8\xab»,
«\xcc» => «\xe0\xb8\xac»,
«\xcd» => «\xe0\xb8\xad»,
«\xce» => «\xe0\xb8\xae»,
«\xcf» => «\xe0\xb8\xaf»,
«\xd0» => «\xe0\xb8\xb0»,
«\xd1» => «\xe0\xb8\xb1»,
«\xd2» => «\xe0\xb8\xb2»,
«\xd3» => «\xe0\xb8\xb3»,
«\xd4» => «\xe0\xb8\xb4»,
«\xd5» => «\xe0\xb8\xb5»,
«\xd6» => «\xe0\xb8\xb6»,
«\xd7» => «\xe0\xb8\xb7»,
«\xd8» => «\xe0\xb8\xb8»,
«\xd9» => «\xe0\xb8\xb9»,
«\xda» => «\xe0\xb8\xba»,
«\xdf» => «\xe0\xb8\xbf»,
«\xe0» => «\xe0\xb9\x80»,
«\xe1» => «\xe0\xb9\x81»,
«\xe2» => «\xe0\xb9\x82»,
«\xe3» => «\xe0\xb9\x83»,
«\xe4» => «\xe0\xb9\x84»,
«\xe5» => «\xe0\xb9\x85»,
«\xe6» => «\xe0\xb9\x86»,
«\xe7» => «\xe0\xb9\x87»,
«\xe8» => «\xe0\xb9\x88»,
«\xe9» => «\xe0\xb9\x89»,
«\xea» => «\xe0\xb9\x8a»,
«\xeb» => «\xe0\xb9\x8b»,
«\xec» => «\xe0\xb9\x8c»,
«\xed» => «\xe0\xb9\x8d»,
«\xee» => «\xe0\xb9\x8e»,
«\xef» => «\xe0\xb9\x8f»,
«\xf0» => «\xe0\xb9\x90»,
«\xf1» => «\xe0\xb9\x91»,
«\xf2» => «\xe0\xb9\x92»,
«\xf3» => «\xe0\xb9\x93»,
«\xf4» => «\xe0\xb9\x94»,
«\xf5» => «\xe0\xb9\x95»,
«\xf6» => «\xe0\xb9\x96»,
«\xf7» => «\xe0\xb9\x97»,
«\xf8» => «\xe0\xb9\x98»,
«\xf9» => «\xe0\xb9\x99»,
«\xfa» => «\xe0\xb9\x9a»,
«\xfb» => «\xe0\xb9\x9b»
);

$string=strtr($string,$iso8859_11);
return $string;
>

The following Perl regular expression tests if a string is well-formed Unicode UTF-8 (Broken up after each | since long lines are not permitted here. Please join as a single line, no spaces, before use.):

UTF-8 — кодировка символов

Юникод поддерживает практически все существующие наборы символов. Наилучшей формой кодирования набора символов Юникода является 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. Большая часть существующего программного обеспечения и практика информационных технологий длительное время опирались на представление символов в виде последовательности байтов. Множество протоколов зависит от неизменности кодировки ASCII и использует либо избегает специальные управляющие символы. Простым способом адаптировать Юникод к таким ситуациям можно, применив 8-битное кодирование для представления символов Юникода, эквивалентных любому символу ASCII или управляющему символу. Для этого и предназначена кодировка UTF-8.

Переменная длина

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

ASCII

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 пришли к соглашению о кодировании всех адресов URL исключительно в 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 байтов EF16 BB16 BF16.

Как задать кодировку UTF-8

В HTML кодировка UTF-8 устанавливается с помощью следующего кода:

˂meta http-equiv=»Content-Type» content=»text/html; charset=utf-8″˃

В PHP кодировка UTF-8 задаётся с помощью функции header() в самом начале файла после задания значения уровня вывода ошибок:

Для подключения к базам данных MySQL кодировка UTF-8 устанавливается так:

В CSS-файлах кодировка символов UTF-8 указывается так:

При сохранении файлов всех типов выбирается кодировка UTF-8 без BOM, иначе сайт работать не будет. Для этого в программе DreamWeave нужно выбрать пункт меню «Модификации – Свойства страницы – Заголовок/Кодировка», изменить кодировку на UTF-8. Затем следует перезагрузить страницу, убрать галочку из пункта «Подключить Юникод сигнатуры (BOM)» и применить изменения. Если какой-либо текст на странице или в базе данных был введён другой формой кодирования, то его нужно ввести заново или перекодировать. При работе с регулярными выражениями обязательно использовать модификатор u.

Также можно сохранить файл в кодировке UTF-8 в «Блокноте» ОС Windows. После выбора пункта меню «Файл – Сохранить как. » установить необходимую форму кодирования и сохранить файл в кодировке UTF-8.

В текстовом редакторе Notepad++, если кодировка отлична от UTF-8, через пункт меню «Преобразовать в UTF-8 без BOM» изменить кодировку и сохранить в кодировке UTF-8.

Альтернативы нет

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

  • поддерживает широкий диапазон инструментальных средств, в том числе совместимость с кодировкой ASCII;
  • обладает устойчивостью к искажению данных;
  • проста и эффективна при обработке;
  • не зависит от платформы.

С появлением UTF-8 дискуссии о том, какая форма кодирования или набор символов лучше, стали бессмысленны.

UTF-8 code page

Unicode UTF-8 — characters 0 (U+0000) to 999 (U+03E7)

UTF-8 stands for Unicode Transformation Format-8. UTF-8 is an octet (8-bit) lossless encoding of Unicode characters, one UTF-8 character uses 1 to 4 bytes.

This website lists the first 100,000 characters on 100 pages. Your browser and the fonts this website uses will not be able to display all characters properly. Hover over a character to enlarge.

Note 1: Some of the control characters in the 128-159 range are no longer in use and have been replaced in many fonts with characters from the Windows-1252 code page for better compatibility (for example the €-sign at U+0080).

Encoding

HTML encoding

Use the decimal column if you would like to encode characters in HTML ( &#[decnumber]; ).
Example: φ in your HTML source shows φ on the screen. Use the HTML special character converter to convert texts.

URL encoding

Use the hexadecimal column, and add a percent sign, for example: %40 corresponds to: @.

Кодировки в python

прочтение статьи занимает 4мин, с обдумыванием — 10мин :)
примечание: данная статья относится к python 2.x, но для python 3.x принцип тот же

Общее

В python есть 2 объекта работающими с текстом: unicode и str, объект unicode хранит символы в формате (кодировке) unicode, объект str является набором байт/символов в которых python хранит остальные кодировки (utf8, cp1251, cp866, koi8-r и др).

Кодировку unicode можно считать рабочей кодировкой питона т.к. она предназначена для её использования в самом скрипте — для разных операций над строками.
Внешняя кодировка (объект str) предназначена для хранения и передачи текстовой информации вне скрипта, например для сохранения в файл или передачи по сети. Поэтому в данной статье я её назвал внешней. Самой используемой кодировкой в мире является utf8 и число приложений переходящих на эту кодировку растет каждый день, таким образом превращаясь в «стандарт». Эта кодировка хороша тем что для хранения текста она занимает оптимальное кол-во памяти и с помощью её можно закодировать почти все языки мира ( в отличие от cp1251 и подобных однобайтовых кодировок). Поэтому рекомендуется везде использовать utf8, и при написании скриптов.

Использование

для того что-бы интерпретатор python понял в какой кодировке файл

Строки в скрипте
Строки в скрипте хранятся байтами, от кавычки до кавычки:

= 6 байт при cp1251
= 12 байт при utf8

Если перед строкой добавить символ u, то при запуске скрипта, эта байтовая строка будет декодирована в unicode из кодировки указанной в начале:

и если кодировка содержимого в файле отличается от указанной, то в строке могут быть «битые символы»

Загрузка и сохранение файла

В последней строке print преобразовал unicode в cp866 автоматический, см. следующий пункт

Авто-преобразование кодировки
В некоторых случаях для упрощения разработки python делает преобразование кодировки, пример с методом print можно посмотреть в предыдущем пункте.
В примере ниже, python сам переводит utf8 в unicode — приводит к одной кодировке для того что-бы сложить строки.

Как видим результирующая строка «c» в unicode. Если бы кодировки строк совпадали то авто-перекодирования не произошло бы и результирующая строка содержала кодировку слагаемых строк.
Авто-перекодирование обычно срабатывает когда происходит взаимодействие разных кодировок.

Пример авто-преобразования кодировок в сравнении

В сравнении 1, кодировка utf8 преобразовалась в unicode и сравнение произошло корректно.
В сравнении 2, сравниваются кодировки одного вида — обе внешние, т.к. кодированы они в разных кодировках условие выдало что они не равны.
В сравнении 3, выпало предупреждение из за того что выполняется сравнение кодировок разного вида — рабочая и внешняя, а авто-декодирование не произошло т.к. стандартная внешняя кодировка = utf8, и декодировать строку в кодировке cp1251 методом utf8 питон не смог.

При выводе списка, происходит вызов [<repr>]() который возвращает внутреннее представление этого спиcка — print 1 и 2 являются аналогичными. Для корректного вывода списка, его нужно преобразовать в строку — print 3.

Установка внешней кодировки при запуске

статья будет дополняться.

Назначение функции utf8_encode

Предположим, что im кодирует мои файлы с помощью UTF-8.

В PHP script будет сравниваться строка:

Его строка действительно UTF-8 без функции utf8_encode()? Если вы кодируете свои файлы с помощью UTF-8, эта функция не нужна?

Если вы прочитали ручную запись для utf8_encode , она преобразует кодированную строку ISO-8859-1 в UTF-8. Имя функции — это ужасное неправильное обозначение, так как оно предлагает какую-то автоматическую кодировку, которая необходима. Это не относится к делу. Если ваш исходный код сохранен как UTF-8, и вы назначаете «あ» на $string , тогда $string содержит символ «あ», закодированный в UTF-8. Никаких дальнейших действий не требуется. Фактически, попытка конвертировать строку UTF-8 (некорректно) из ISO-8859-1 в UTF-8 будет искажать ее.

Чтобы разработать немного больше, ваш исходный код читается как последовательность байтов. PHP интерпретирует важную для него информацию (все ключевые слова и операторы и т.д.) В ASCII. UTF-8 обратно совместим с ASCII. Это означает, что все «обычные» символы ASCII представлены с использованием того же байта как в ASCII, так и в UTF-8. Таким образом, » интерпретируется как » PHP независимо от того, должен ли он быть сохранен в ASCII или UTF-8. Что-либо между кавычками, PHP просто принимает как литерал бит последовательности. Поэтому PHP видит ваш «あ» как «11100011 10000001 10000010» . Неважно, что именно находится между кавычками, оно просто будет использовать его как есть.

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

Если вы установили содержимое строковых переменных на что-то вроде:

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

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

Предположим, что это действительно допустимый UTF-8 (поддержка моего шрифта):

Затем вы можете выполнить двоичное сравнение строки позже:

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

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

Что такое код utf8_encode

(PHP 3>= 3.0.6, PHP 4, PHP 5)

utf8_encode — кодирует строку ISO-8859-1 в UTF-8.

Описание

string utf8_encode (string data)

Эта функция кодирует строку data в UTF-8 и возвращает кодированную версию. UTF-8 это стандартный механизм Unicode для кодирования wide character -значений в байтовый поток. UTF-8 прозрачна для обычных ASCII -символов, самосинхронизируется (т.е. программа может указать, где начинаются символы байтового потока) и может использоваться с функциями сравнения нормальных строк для сортировки их как таковых.PHP кодирует UTF-8 символы в блоки до 4 байтов, как здесь:

Таблица 1. Кодирование UTF-8
байтов битов представление
1 7 0bbbbbbb
2 11 110bbbbb 10bbbbbb
3 16 1110bbbb 10bbbbbb 10bbbbbb
4 21 11110bbb 10bbbbbb 10bbbbbb 10bbbbbb

Каждый b представляет бит, который может использоваться для хранения данных символа.

Илон Маск рекомендует:  Sqlфункции без использования фразы group by
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL