首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

PHP 將 HTML 實體編碼(&#xXXXX;)轉為中文:unicode_decode 完整函數

     編輯:程式設計綜合問答

遇到 今何... 這類十六進制 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;
        // 處理十六進制 &#xXXXX;
        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 轉目標編碼。
  • 補充對代理對(>0xFFFF)的處理,完整支援 Emoji 等補充平面字符。
  • 若確定輸入純十六進制,可簡化正則:preg_replace_callback('/&#x([0-9a-fA-F]+);/', fn($m) => mb_chr(hexdec($m[1]), 'UTF-8'), $str)(PHP 7.2+)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved