(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"; // UTF-8 編碼的 'Zoë'
$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(Replacement Character,替換字元)取代。
<?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