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

PHP判斷字符串是否為UTF-8編碼:基於正則匹配中文字符3字節特徵

     編輯:關於C語言

核心邏輯:UTF-8 中文字符的字節特徵

UTF-8 編碼中,漢字等常用字符佔3個字節,字節範圍固定:

  • 第1字節:0xE4 (228) ~ 0xE9 (233)
  • 第2、3字節:0x80 (128) ~ 0xBF (191)

利用此規律,構造正則表達式匹配字符串中是否存在符合「3字節UTF-8漢字模式」的片段,即可判定是否為UTF-8編碼。

完整 PHP 函數

function is_utf8($str) {
    // 匹配開頭、結尾或連續2組以上的 3字節UTF-8漢字模式
    $pattern = '/^([\xE4-\xE9][\x80-\xBF][\x80-\xBF]){1}$'
             . '|^([\xE4-\xE9][\x80-\xBF][\x80-\xBF]){1}'
             . '|([\xE4-\xE9][\x80-\xBF][\x80-\xBF]){1}$'
             . '|([\xE4-\xE9][\x80-\xBF][\x80-\xBF]){2,}/';
    return (bool)preg_match($pattern, $str);
}

正則拆解說明

  • ^([\xE4-\xE9][\x80-\xBF][\x80-\xBF]){1}$:整個字符串**恰好是一個**3字節UTF-8字符。
  • ^([\xE4-\xE9][\x80-\xBF][\x80-\xBF]){1}:字符串**開頭**有一個3字節UTF-8字符。
  • ([\xE4-\xE9][\x80-\xBF][\x80-\xBF]){1}$:字符串**結尾**有一個3字節UTF-8字符。
  • ([\xE4-\xE9][\x80-\xBF][\x80-\xBF]){2,}:字符串**中間**包含**連續兩個或以上**3字節UTF-8字符。

四種情形任一滿足即返回 true,否則 false。

使用示例

$test1 = "你好世界";  // UTF-8編碼
$test2 = "hello";      // 純ASCII
$test3 = "测试";       // UTF-8編碼

var_dump(is_utf8($test1)); // bool(true)
var_dump(is_utf8($test2)); // bool(false)
var_dump(is_utf8($test3)); // bool(true)

局限性與改進方向

  • 僅針對中文常用字符區塊(基本多文種平面 BMP 中 CJK 統一表意文字),Emoji、生僻字(4字節)不在檢測範圍。
  • 誤判風險:某些非UTF-8編碼的二進制數據碰巧匹配該字節模式會誤報。
  • 生產環境建議:使用 PHP 內置 mb_check_encoding($str, 'UTF-8') 或 mb_detect_encoding(),準確率更高、覆蓋字符集更全。

總結

本文正則方案適合快速原型、簡單過濾、無mbstring擴展環境的場景。正規項目請優先使用 PHP 多字節字符串函數庫,保證編碼檢測的權威性與完備性。

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