在處理多語言文本、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
?>
ord() 獲取每個字節的數值< 65 (ord('A')):控制字符或數字< 128:標準 ASCII>= 128:UTF-8 多字節字符110xxxxx 10xxxxxx (0xC0-0xDF 開頭)1110xxxx 10xxxxxx 10xxxxxx (0xE0-0xEF 開頭)\u 前綴| 方法 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| 本函數 | 無擴展依賴、邏輯清晰可控 | 性能一般、不支持 4 字節字符 | 舊環境、教學演示 |
json_encode() | 原生高性能、完整支持 Unicode | 會添加雙引號、轉義斜桿 | 現代 PHP (5.3+) |
mb_convert_encoding() | 官方標準、功能完整 | 需 mbstring 擴展 | 生產環境推薦 |
iconv() | 跨平台標準 | 需 iconv 擴展 | 系統級轉換 |
<?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(),但理解手動轉換原理有助於處理特殊編碼場景、調試字符問題以及在受限環境下工作。