(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)
UConverter::transcode — 将字符串从一种字符编码转换为另一种字符编码
$str
,$toEncoding
,$fromEncoding
,$options
= null
将str
从fromEncoding
转换为toEncoding
。
返回转换后的字符串,或在失败时返回false
。
示例 #1 从UTF-8转换为UTF-16再转换回UTF-8
<?php
$utf8_string = "\x5A\x6F\xC3\xAB"; // 'Zoë' in 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" (Substitute)
$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