utf8_decode

(PHP 4, PHP 5, PHP 7, PHP 8)

utf8_decode Преобразовывает строку из кодировки UTF-8 в кодировку ISO-8859-1, заменяя недопустимые или непредставимые символы

Внимание

Функция УСТАРЕЛА с PHP 8.2.0. Пользоваться функцией настоятельно не рекомендуют.

Описание

#[\Deprecated]
utf8_decode(string $string): string

Функция преобразовывает строку 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) "?"

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

  • utf8_encode() - Преобразовывает строку из кодировки ISO-8859-1 в кодировку UTF-8
  • mb_convert_encoding() - Преобразовывает строку из одной кодировки символов в другую
  • UConverter::transcode() - Преобразовывает строку из одной кодировки символов в другую
  • iconv() - Преобразовывает строку из одной кодировки символов в другую