首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 解碼 Unicode 中文字符:方案封裝與單引號陷阱詳解

     編輯:PHP 相關知識

PHP 解碼 Unicode 中文字符:方案封裝與單引號陷阱詳解

抓取數據遇到 \u65b0\u6d6a\u5fae\u535a 等 Unicode 轉義序列,需還原為中文。本文提供兩種方案並重點分析 JSON 方案的單引號限制。

方案 A:正則回調 + mb_convert_encoding(推薦)

function replace_unicode_escape_sequence($match) {
    return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE');
}

$name = '\u65b0\u6d6a\u5fae\u535a';
$str = preg_replace_callback('/\\\\u([0-9a-f]{4})/i', 'replace_unicode_escape_sequence', $name);
echo $str; // 新浪微博

工具類封裝

class Helper_Tool {
    static function unicodeDecode($data) {
        return preg_replace_callback(
            '/\\\\u([0-9a-f]{4})/i',
            function ($match) {
                return mb_convert_encoding(pack('H*', $match[1]), 'UTF-8', 'UCS-2BE');
            },
            $data
        );
    }
}

$name = '\u65b0\u6d6a\u5fae\u535a';
$data = Helper_Tool::unicodeDecode($name); // 新浪微博

方案 B:JSON 解碼(需注意單引號)

function unicodeDecode($name) {
    $json = '{"str":"'.$name.'"}';
    $arr = json_decode($json, true);
    if (empty($arr)) return '';
    return $arr['str'];
}

$name = '\u65b0\u6d6a\u5fae\u535a';
echo unicodeDecode($name); // 新浪微博

⚠ 方案 B 關鍵限制

輸入字符串 絕不能包含單引號 ('),否則構造的 JSON 字符串語法無效,json_decode 返回 null。使用前必須預處理:

$name = str_replace("'", "\'", $name); // 轉義單引號

技術原理解析

  • 方案 A:提取 \uXXXX 十六進制碼位,pack('H*') 轉二進制,mb_convert_encoding 從 UCS-2BE 轉 UTF-8
  • 方案 B:利用 JSON 規範原生支援 \uXXXX 轉義,構造合法 JSON 字符串解析

選擇建議

生產環境優先方案 A,無特殊字符限制、穩健可靠;可控輸入且極度追求性能時可用方案 B(需嚴格預處理)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved