(PHP 4, PHP 5, PHP 7, PHP 8)
utf8_encode — Преобразовывает строку из кодировки ISO-8859-1 в кодировку UTF-8
Начиная с PHP 8.2.0 функция УСТАРЕЛА. Полагаться на функцию настоятельно не рекомендуют.
Функция преобразовывает строку string из кодировки
ISO-8859-1 в кодировку UTF-8.
Замечание:
Функция не пытается угадать текущую кодировку предоставленной строки, а предполагает, что строку закодировали в кодировке ISO-8859-1 (которую также знают как Latin 1) и преобразовывает строку в кодировку UTF-8. Поскольку каждая последовательность байтов — корректная строка в кодировке ISO-8859-1, это никогда не приводит к ошибке, но не приведёт к получению полезной строки, если предполагалась другая кодировка.
Часто веб-страницы, которые отметили как страницы в кодировке
ISO-8859-1, кодируются похожей кодировкой —Windows-1252, и браузеры интерпретируют страницы в кодировкеISO-8859-1как страницы в кодировкеWindows-1252. Однако кодировкаWindows-1252вместо управляющих кодов кодировкиISO-8859-1содержит дополнительные печатные символы наподобие знака евро€и английских двойных кавычек"". Функция не конвертирует такие символы кодировкиWindows-1252корректно. Для конвертации в кодировкуWindows-1252пользуются альтернативными функциями.
stringСтрока в кодировке ISO-8859-1.
Функция возвращает строку string, которую преобразовала в кодировку в UTF-8.
| Версия | Описание |
|---|---|
| 8.2.0 | Функция устарела. |
| 7.2.0 | Функцию перенесли из модуля XML в ядро PHP. В предыдущих версиях функция была доступна только при установленном модуле XML. |
Пример #1 Простой пример преобразования строки из кодировки ISO-8859-1 в кодировку UTF-8
<?php
// Преобразование строки 'Zoë' из кодировки ISO 8859-1 в кодировку UTF-8
$iso8859_1_string = "\x5A\x6F\xEB";
$utf8_string = utf8_encode($iso8859_1_string);
echo bin2hex($utf8_string), "\n";
?>Результат выполнения приведённого примера:
5a6fc3ab
Замечание: Устаревание и альтернативы
Начиная с PHP 8.2.0 функция устарела и её удалят в будущей версии. Разработчики языка рекомендуют заменить вызовы функции в коде альтернативами.
Аналогичную функциональность даёт функция mb_convert_encoding() , которая поддерживает кодировку ISO-8859-1 и набор других кодировок символов.
<?php $iso8859_1_string = "\xEB"; // Символ "ë" — буква «e» с диерезисом в кодировке UTF-8 $utf8_string = mb_convert_encoding($iso8859_1_string, 'UTF-8', 'ISO-8859-1'); echo bin2hex($utf8_string), "\n"; $iso8859_7_string = "\xEB"; // Та же строка в кодировке ISO-8859-7 представляет символ «λ» — греческую строчную лямбду $utf8_string = mb_convert_encoding($iso8859_7_string, 'UTF-8', 'ISO-8859-7'); echo bin2hex($utf8_string), "\n"; $windows_1252_string = "\x80"; // Символ "€" — знак евро в кодировке Windows-1252, не содержится в кодировке ISO-8859-1 $utf8_string = mb_convert_encoding($windows_1252_string, 'UTF-8', 'Windows-1252'); echo bin2hex($utf8_string), "\n"; ?>Результат выполнения приведённого примера:
c3ab cebb e282acДругие способы, доступность которых зависит от загруженных модулей, — метод UConverter::transcode() и функция iconv() .
Каждый следующий способ даёт один и тот же результат:
<?php $iso8859_1_string = "\x5A\x6F\xEB"; // 'Zoë' в кодировке ISO-8859-1 $utf8_string = utf8_encode($iso8859_1_string); echo bin2hex($utf8_string), "\n"; $utf8_string = mb_convert_encoding($iso8859_1_string, 'UTF-8', 'ISO-8859-1'); echo bin2hex($utf8_string), "\n"; $utf8_string = UConverter::transcode($iso8859_1_string, 'UTF8', 'ISO-8859-1'); echo bin2hex($utf8_string), "\n"; $utf8_string = iconv('ISO-8859-1', 'UTF-8', $iso8859_1_string); echo bin2hex($utf8_string), "\n"; ?>Результат выполнения приведённого примера:
5a6fc3ab 5a6fc3ab 5a6fc3ab 5a6fc3ab
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.Here's some code that addresses the issue that Steven describes in the previous comment;
<?php
/* 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);
}
?>If you haven't guessed already: If the UTF-8 character has no representation in the ISO-8859-1 codepage, a ? will be returned. You might want to wrap a function around this to make sure you aren't saving a bunch of ???? into your database.