(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 并返回
<?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