遇到 今何... 這類十六進制 HTML 實體,需解碼為 UTF-8/GBK 中文。PHP 內無現成函數,需自行實現。
function unicode_decode(string $unistr, string $encoding = 'UTF-8', string $prefix = '', string $postfix = ';'): string {
$arr = explode($prefix, $unistr);
$result = '';
for ($i = 1, $len = count($arr); $i < $len; $i++) {
$codeStr = $postfix ? substr($arr[$i], 0, -strlen($postfix)) : $arr[$i];
$code = (int) $codeStr;
// 處理十六進制 XXXX;
if (stripos($codeStr, 'x') === 0 || stripos($codeStr, 'X') === 0) {
$code = hexdec(substr($codeStr, 1));
}
// 轉為 UTF-16BE 字節序
$result .= ($code < 0x10000)
? pack('n', $code)
: pack('NN', 0xD800 | (($code - 0x10000) >> 10), 0xDC00 | (($code - 0x10000) & 0x3FF));
}
return iconv('UTF-16BE', $encoding . '//IGNORE', $result);
}
// 使用示例
$str = '今何在作品';
echo unicode_decode($str); // 輸出:今天在作品
pack('n', ...) 生成大端序 UTF-16 字節,配合 iconv 轉目標編碼。preg_replace_callback('/([0-9a-fA-F]+);/', fn($m) => mb_chr(hexdec($m[1]), 'UTF-8'), $str)(PHP 7.2+)。