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

PHP 實現 UTF-8 轉 Unicode 編碼函數

     編輯:PHP 相關知識

PHP 實現 UTF-8 轉 Unicode 編碼函數

在處理多語言文本、JSON 序列化、前端傳輸等場景中,常需要將 UTF-8 字符串轉換為 Unicode 轉義格式(如 \u4e2d\u6587)。本文提供一個純 PHP 實現的轉換函數,無需依賴 mbstring 或 iconv 擴展。

核心函數代碼

<?php
/**
 * UTF-8 字符串轉 Unicode 轉義格式
 * @param string $str UTF-8 編碼字符串
 * @return string Unicode 格式字符串(如 \u4e2d\u6587)
 */
function utf8_to_unicode($str) {
    $unicode = array();
    $values = array();
    $lookingFor = 1;

    for ($i = 0; $i < strlen($str); $i++) {
        $thisValue = ord($str[$i]);

        // ASCII 控制字符和數字處理
        if ($thisValue < ord('A')) {
            if ($thisValue >= ord('0') && $thisValue <= ord('9')) {
                // 0-9 直接保留
                $unicode[] = chr($thisValue);
            } else {
                // 其他控制字符十六進制轉義
                $unicode[] = '%' . dechex($thisValue);
            }
        } else {
            if ($thisValue < 128) {
                // 標準 ASCII 可打印字符
                $unicode[] = $str[$i];
            } else {
                // 多字節 UTF-8 字符處理
                if (count($values) == 0) {
                    // 判斷字節數:224-239 為 3 字節,192-223 為 2 字節
                    $lookingFor = ($thisValue < 224) ? 2 : 3;
                }
                $values[] = $thisValue;

                if (count($values) == $lookingFor) {
                    // 計算 Unicode 碼點
                    if ($lookingFor == 3) {
                        // 3 字節:xxxx xxxx 1110xxxx 10xxxxxx 10xxxxxx
                        $number = (($values[0] % 16) * 4096) + (($values[1] % 64) * 64) + ($values[2] % 64);
                    } else {
                        // 2 字節:xxxx xxxx 110xxxxx 10xxxxxx
                        $number = (($values[0] % 32) * 64) + ($values[1] % 64);
                    }

                    $number = dechex($number);
                    // 補齊 4 位十六進制
                    $unicode[] = (strlen($number) == 3) ? "\u0{$number}" : "\u{$number}";

                    // 重置狀態
                    $values = array();
                    $lookingFor = 1;
                }
            }
        }
    }

    return implode("", $unicode);
}

// 測試
echo utf8_to_unicode("中文測試123"); // 輸出:\u4e2d\u6587\u6e2c\u8a66123
?>

函數原理解析

  1. 逐字節遍歷:使用 ord() 獲取每個字節的數值
  2. 識別字符類型:
    • < 65 (ord('A')):控制字符或數字
    • < 128:標準 ASCII
    • >= 128:UTF-8 多字節字符
  3. UTF-8 字節序列解析:
    • 2 字節字符:110xxxxx 10xxxxxx (0xC0-0xDF 開頭)
    • 3 字節字符:1110xxxx 10xxxxxx 10xxxxxx (0xE0-0xEF 開頭)
  4. 碼點計算:通過位運算提取有效位組合成 Unicode 碼點
  5. 格式化輸出:轉為 4 位十六進制,添加 \u 前綴

替代方案對比

方法優點缺點適用場景
本函數無擴展依賴、邏輯清晰可控性能一般、不支持 4 字節字符舊環境、教學演示
json_encode()原生高性能、完整支持 Unicode會添加雙引號、轉義斜桿現代 PHP (5.3+)
mb_convert_encoding()官方標準、功能完整需 mbstring 擴展生產環境推薦
iconv()跨平台標準需 iconv 擴展系統級轉換

現代 PHP 推薦寫法

<?php
// PHP 5.4+ 簡單高效
function utf8_to_unicode_modern($str) {
    $json = json_encode($str);
    // 去除首尾雙引號
    return substr($json, 1, -1);
}

// 或者保持結構
$arr = ['text' => '中文測試'];
echo json_encode($arr, JSON_UNESCAPED_UNICODE); // 保持中文可讀
echo json_encode($arr); // 自動轉義為 \uXXXX
?>

應用場景示例

<?php
// 1. JavaScript 字符串嵌入
$jsStr = utf8_to_unicode("用戶名:張三");
echo "<script>var msg = '$jsStr';</script>";

// 2. API 響應構建
$response = [
    'message' => utf8_to_unicode('操作成功'),
    'data' => ['id' => 123]
];
echo json_encode($response);

// 3. 數據庫存儲特殊字符
$sql = "INSERT INTO logs (msg) VALUES ('" . utf8_to_unicode($userInput) . "')";
?>

雖然現代 PHP 項目推薦使用 json_encode() 或 mb_convert_encoding(),但理解手動轉換原理有助於處理特殊編碼場景、調試字符問題以及在受限環境下工作。

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