(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)
UConverter::transcode — Преобразовывает строку из одной кодировки символов в другую
$str,$toEncoding,$fromEncoding,$options = null
Преобразовывает строку str из кодировки fromEncoding в toEncoding.
strСтрока (string) для преобразования.
toEncodingТребуемая кодировка результата.
fromEncoding
Текущая кодировка строки str.
optionsНеобязательный массив (array), который может содержать следующие ключи:
'to_subst' - подстановочный символ, используемый вместо любого символа
строки str, который не может быть закодирован в toEncoding.
Если ключ указан, он должен представлять один символ в целевой кодировке.
Возвращает преобразованную строку или false, если возникла ошибка.
Пример #1 Преобразование из UTF-8 в UTF-16 и обратно
<?php
$utf8_string = "\x5A\x6F\xC3\xAB"; // 'Zoë' в UTF-8
$utf16_string = UConverter::transcode($utf8_string, 'UTF-16BE', 'UTF-8');
echo bin2hex($utf16_string), "\n";
$new_utf8_string = UConverter::transcode($utf16_string, 'UTF-8', 'UTF-16BE');
echo bin2hex($new_utf8_string), "\n";
?>Результат выполнения приведённого примера:
005a006f00eb 5a6fc3ab
Пример #2 Недопустимые символы во входной строке
Если входная строка содержит последовательность байтов, которая не является допустимой в кодировке,
указанной в fromEncoding, то перед преобразованием в toEncoding
она заменяется кодовой точкой Unicode U+FFFD (Заменяющий символ).
<?php
$invalid_utf8_string = "\xC3"; // неполная многобайтовая последовательность UTF-8
$utf16_string = UConverter::transcode($invalid_utf8_string, 'UTF-16BE', 'UTF-8');
echo bin2hex($utf16_string), "\n";
?>Результат выполнения приведённого примера:
fffd
Пример #3 Символы, которые не могут быть закодированы
Если входная строка содержит символы, которые не могут быть представлены в
кодировке toEncoding, они заменяются одним символом.
Используемый по умолчанию символ зависит от кодировки и может управляться
с помощью параметра 'to_subst'.
<?php
$utf8_string = "\xE2\x82\xAC"; // € (Знак евро) не существует в ISO 8859-1
// Замена по умолчанию в ISO 8859-1 - "\x1A" (Заменитель)
$iso8859_1_string = UConverter::transcode($utf8_string, 'ISO-8859-1', 'UTF-8');
echo bin2hex($iso8859_1_string), "\n";
// Использование в качестве заменителя символа '?' ("\x3F").
$iso8859_1_string = UConverter::transcode(
$utf8_string, 'ISO-8859-1', 'UTF-8', ['to_subst' => '?']
);
echo bin2hex($iso8859_1_string), "\n";
// Поскольку ISO 8859-1 не может отобразить U+FFFD, недействительная входная строка также заменяется на to_subst
$invalid_utf8_string = "\xC3"; // неполная многобайтовая последовательность UTF-8
$iso8859_1_string = UConverter::transcode(
$invalid_utf8_string, 'ISO-8859-1', 'UTF-8', ['to_subst' => '?']
);
echo bin2hex($iso8859_1_string), "\n";
?>Результат выполнения приведённого примера:
1a 3f 3f