(PHP 4, PHP 5, PHP 7, PHP 8)
utf8_decode — Преобразовывает строку из кодировки UTF-8 в кодировку ISO-8859-1, заменяя недопустимые или непредставимые символы
Функция УСТАРЕЛА с PHP 8.2.0. Пользоваться функцией настоятельно не рекомендуют.
Функция преобразовывает строку string
из кодировки
UTF-8
в кодировку ISO-8859-1
.
Байты в строке, которые не соответствуют корректным символам кодировки UTF-8
и UTF-8
-символам, которые не содержатся в кодировке ISO-8859-1
—
кодовые точки выше U+00FF
, заменяются на символ ?
.
Замечание:
Часто веб-страницы, которые отметили как страницы в кодировке
ISO-8859-1
, кодируются похожей кодировкой —Windows-1252
, и браузеры интерпретируют страницы в кодировкеISO-8859-1
как страницы в кодировкеWindows-1252
. Однако кодировкаWindows-1252
вместо управляющих кодов кодировкиISO-8859-1
содержит дополнительные печатные символы наподобие знака евро€
и английских двойных кавычек“
”
. Функция не конвертирует такие символы кодировкиWindows-1252
корректно. Для конвертации в кодировкуWindows-1252
пользуются альтернативными функциями.
string
Строка в кодировке UTF-8.
Функция возвращает данные параметра string
, которые преобразовала в кодировку ISO-8859-1.
Версия | Описание |
---|---|
8.2.0 | Функция устарела. |
7.2.0 | Функцию перенесли из модуля XML в ядро PHP. В предыдущих версиях функция была доступна только при установленном модуле XML. |
Пример #1 Простой пример преобразования строки из кодировки UTF-8 в кодировку ISO-8859-1
<?php
// Преобразование строки 'Zoë' из кодировки UTF-8 в кодировку ISO 8859-1
$utf8_string = "\x5A\x6F\xC3\xAB";
$iso8859_1_string = utf8_decode($utf8_string);
echo bin2hex($iso8859_1_string), "\n";
// Неправильные для кодировки UTF-8 последовательности заменяются на '?'
$invalid_utf8_string = "\xC3";
$iso8859_1_string = utf8_decode($invalid_utf8_string);
var_dump($iso8859_1_string);
// Символы, которые не содержатся в кодировке ISO 8859-1 наподобие
// знака евро '€', тоже заменяются символом '?'
$utf8_string = "\xE2\x82\xAC";
$iso8859_1_string = utf8_decode($utf8_string);
var_dump($iso8859_1_string);
?>
Результат выполнения приведённого примера:
5a6feb string(1) "?" string(1) "?"
Замечание: Устаревание и альтернативы
Начиная с PHP 8.2.0 функция устарела и её удалят в будущей версии. Разработчики языка рекомендуют заменить вызовы функции в коде альтернативами.
Аналогичную функциональность даёт функция mb_convert_encoding(), которая поддерживает кодировку ISO-8859-1 и набор других кодировок символов.
<?php
$utf8_string = "\xC3\xAB"; // 'ë' — буква «e» с диерезисом в кодировке UTF-8
$iso8859_1_string = mb_convert_encoding($utf8_string, 'ISO-8859-1', 'UTF-8');
echo bin2hex($iso8859_1_string), "\n";
$utf8_string = "\xCE\xBB"; // 'λ' — греческая строчная лямбда в кодировке UTF-8
$iso8859_7_string = mb_convert_encoding($utf8_string, 'ISO-8859-7', 'UTF-8');
echo bin2hex($iso8859_7_string), "\n";
$utf8_string = "\xE2\x82\xAC"; // '€' — символ евро в кодировке UTF-8, не содержится в кодировке ISO-8859-1
$windows_1252_string = mb_convert_encoding($utf8_string, 'Windows-1252', 'UTF-8');
echo bin2hex($windows_1252_string), "\n";
?>Результат выполнения приведённого примера:
eb eb 80Другие способы, доступность которых зависит от загруженных модулей, — метод UConverter::transcode() и функция iconv().
Каждый следующий способ даёт один и тот же результат:
Символ<?php
$utf8_string = "\x5A\x6F\xC3\xAB"; // 'Zoë' в кодировке UTF-8
$iso8859_1_string = utf8_decode($utf8_string);
echo bin2hex($iso8859_1_string), "\n";
$iso8859_1_string = mb_convert_encoding($utf8_string, 'ISO-8859-1', 'UTF-8');
echo bin2hex($iso8859_1_string), "\n";
$iso8859_1_string = iconv('UTF-8', 'ISO-8859-1', $utf8_string);
echo bin2hex($iso8859_1_string), "\n";
$iso8859_1_string = UConverter::transcode($utf8_string, 'ISO-8859-1', 'UTF8');
echo bin2hex($iso8859_1_string), "\n";
?>Результат выполнения приведённого примера:
5a6feb 5a6feb 5a6feb 5a6feb'?'
как значение элемента'to_subst'
в массиве опций метода UConverter::transcode() даёт тот же результат, что и функция utf8_decode() для недопустимых строк или строк, которые невозможно представить в кодировке ISO 8859-1.<?php
$utf8_string = "\xE2\x82\xAC"; // € — символ евро, отсутствует в кодировке ISO-8859-1
$iso8859_1_string = UConverter::transcode(
$utf8_string,
'ISO-8859-1',
'UTF-8',
['to_subst' => '?']
);
var_dump($iso8859_1_string);
?>Результат выполнения приведённого примера:
sring(1) "?"