(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