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

PHP Unicode 與 UTF-8 編碼轉換深度解析與實現

     編輯:PHP 綜合知識

Unicode vs UTF-8

  • Unicode:字符集,固定雙字節(BMP 範圍)
  • UTF-8:Unicode 實現之一,可變長度(ASCII 1 字節,漢字 3 字節)
  • 漢字在 Unicode 佔 2 字節,UTF-8 佔 3 字節

UTF-8 編碼規則表

U-00000000 - U-0000007F: 0xxxxxxx
U-00000080 - U-000007FF: 110xxxxx 10xxxxxx
U-00000800 - U-0000FFFF: 1110xxxx 10xxxxxx 10xxxxxx  ← 漢字在此範圍
U-00010000 - U-001FFFFF: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
...

首字節前導 1 的個數即總字節數。

Unicode → UTF-8 轉換原理(以「你」U+4F60 為例)

  1. Unicode 十六進制 4F60 → 二進制 100111101100000
  2. 按 UTF-8 三字節模板填充:
    • 高 4 位 → 首字節後 4 位:1110 + 0100 = 11100100 (0xE4)
    • 中 6 位 → 次字節後 6 位:10 + 111101 = 10111101 (0xBD)
    • 低 6 位 → 尾字節後 6 位:10 + 100000 = 10100000 (0xA0)
  3. 結果:E4 BD A0

UTF-8 → Unicode 逆向提取

  1. 首字節 & 0x1F 取低 5 位,左移 12 位
  2. 次字節 & 0x3F 取低 6 位,左移 6 位
  3. 尾字節 & 0x3F 取低 6 位
  4. 三者按位或合成 Unicode 值

PHP 實現函數

/** UTF-8 單字符 → Unicode 十六進制字符串 */
function utf8_str_to_unicode($utf8_str) {
    $unicode = 0;
    $unicode = (ord($utf8_str[0]) & 0x1F) << 12;
    $unicode |= (ord($utf8_str[1]) & 0x3F) << 6;
    $unicode |= (ord($utf8_str[2]) & 0x3F);
    return dechex($unicode);
}

/** Unicode 十六進制字符串 → UTF-8 單字符 */
function unicode_to_utf8($unicode_str) {
    $code = intval(hexdec($unicode_str)); // 必須轉整型
    $ord1 = 0xE0 | ($code >> 12);
    $ord2 = 0x80 | (($code >> 6) & 0x3F);
    $ord3 = 0x80 | ($code & 0x3F);
    return chr($ord1) . chr($ord2) . chr($ord3);
}

// 測試
$utf8_str = '我';      // Unicode: 6211
$unicode_str = '4f60'; // 你
echo utf8_str_to_unicode($utf8_str) . "<br/>"; // 6211
echo unicode_to_utf8($unicode_str);               // 你

擴展建議

  • 封裝為處理整文字符串的 utf8_to_unicode_str/unicode_str_to_utf8
  • 支援 4 字節 UTF-8(Emoji 等補充平面字符)
  • 現代 PHP 可直接用 json_encode($str, JSON_UNESCAPED_UNICODE) 等內建函數
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved