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

PHP 判斷字符串是否為 UTF-8 編碼的兩種高效方法

     編輯:PHP 相關知識

PHP 判斷字符串是否為 UTF-8 編碼的兩種高效方法

在編碼轉換(iconv、mb_convert_encoding)前檢測字符串是否已為 UTF-8,可避免重複轉碼導致亂碼。本文提供正則嚴格驗證與 mb_detect_encoding 兩種方案,並分析優缺點。

方法一:嚴格正則驗證(RFC 3629 標準)

<?php
function is_utf8($string) {
    // 來源:W3C 國際化 QA
    return (bool) preg_match('%^(?:
        [\x09\x0A\x0D\x20-\x7E]            # ASCII
      | [\xC2-\xDF][\x80-\xBF]             # 非超長 2 字節
      | \xE0[\xA0-\xBF][\x80-\xBF]         # 排除超長 3 字節
      | [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}  # 直通 3 字節
      | \xED[\x80-\x9F][\x80-\xBF]         # 排除代理區
      | \xF0[\x90-\xBF][\x80-\xBF]{2}      # 平面 1-3
      | [\xF1-\xF3][\x80-\xBF]{3}          # 平面 4-15
      | \xF4[\x80-\x8F][\x80-\xBF]{2}      # 平面 16
    )*$%xs', $string);
}
?>

✅ 優點:完全符合 UTF-8 規範,拒絕非法字節序列(如超長編碼、代理對)。
⚠️ 缺點:正則複雜,效率略低於內建函數。

方法二:mb_detect_encoding 快速檢測

<?php
function mb_is_utf8($string) {
    return mb_detect_encoding($string, 'UTF-8', true) === 'UTF-8';
}

// 多編碼檢測示例
$encoding = mb_detect_encoding($text, ['UTF-8', 'GBK', 'GB2312'], true);
switch ($encoding) {
    case 'UTF-8':  /* 已是 UTF-8 */ break;
    case 'GBK':    $text = iconv('GBK', 'UTF-8', $text); break;
    default:       /* 未知編碼處理 */ break;
}
?>

✅ 優點:C 層實現極快、API 簡潔、支持多編碼列表按順序嘗試。
⚠️ 缺點:mbstring 擴展非核心編譯(需 --enable-mbstring),極短字符串可能誤判。

性能對比(100 萬次循環)

方法耗時備註
preg_match 正則~1.8s純 PHP 正則引擎
mb_detect_encoding~0.3sC 內建函數

實戰建議

  1. 高性能場景:優先 mb_detect_encoding($str, 'UTF-8', true)(第三參數 true 開啟嚴格模式)。
  2. 安全關鍵場景:存儲入庫、跨系統傳輸前,雙重驗證(mb_is_utf8 先篩,可疑再走正則)。
  3. 無 mbstring 環境:僅用正則版 is_utf8()。
  4. 批量處理:對大文件流式讀取時,抽樣檢測首 4KB 即可決定整體編碼。

擴展:輸出 UTF-8 字符的 URL 編碼形式

<?php
// 輸入「呵」→ 輸出 %E5%91%B5
echo urlencode("呵");  // 內部按腳本編碼(通常UTF-8)轉換
?>
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved