PHP Conference Japan 2024

UConverter::transcode

(PHP 5 >= 5.5.0, PHP 7, PHP 8, PECL >= 3.0.0a1)

UConverter::transcode将字符串从一种字符编码转换为另一种字符编码

描述

public static UConverter::transcode(
    string $str,
    string $toEncoding,
    string $fromEncoding,
    ?array $options = null
): string|false

strfromEncoding转换为toEncoding

参数

str

要转换的string

toEncoding

结果所需的编码。

fromEncoding

用于解释str的当前编码。

options

可选的array,可能包含以下键

  • 'to_subst' - 用于替换str中任何无法在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

参见

  • mb_convert_encoding() - 将字符串从一种字符编码转换为另一种字符编码
  • iconv() - 将字符串从一种字符编码转换为另一种

添加注释

用户贡献的注释

此页面没有用户贡献的注释。
To Top