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

PHP 多編碼環境下字串長度計算與截取正確姿勢

     編輯:PHP 相關知識

編碼與位元組長度差異

編碼中文字元位元組數strlen() 結果mb_strlen() 結果
UTF-83259
GB23122179
$str = '測試文字a測試文字';
// UTF-8 檔案
echo strlen($str);           // 25 (bytes)
echo mb_strlen($str,'utf-8'); // 9 (chars)
// GB2312 檔案
echo strlen($str);            // 17 (bytes)
echo mb_strlen($str,'gb2312'); // 9 (chars)

MySQL VARCHAR 陷阱

MySQL 5.1+ VARCHAR(10) 存 10 個字元(非位元組),無論編碼。但若應用層用 strlen() 截取再存入,UTF-8 環境下 10 字元可能佔 30 位元組,超過欄位定義(若定義為位元組長度)導致截斷或報錯。務必用 mb_strlen()/mb_substr() 按字元計算。

UTF-8 純 PHP 截取函數(無 mbstring 時)

function utf8_substr($str, $start, $length) {
    $result = '';
    $i = $count = 0;
    $len = strlen($str);
    while ($i < $len && $count < $start + $length) {
        $byte = ord($str[$i]);
        if ($byte < 128) { // ASCII
            $char = $str[$i++];
        } elseif ($byte < 224) { // 2-byte
            $char = substr($str, $i, 2); $i += 2;
        } elseif ($byte < 240) { // 3-byte
            $char = substr($str, $i, 3); $i += 3;
        } else { // 4-byte
            $char = substr($str, $i, 4); $i += 4;
        }
        if ($count++ >= $start) $result .= $char;
    }
    return $result;
}

最佳實踐清單

  1. 專案全站統一 UTF-8 無 BOM,資料庫 utf8mb4。
  2. 安裝 mbstring,所有字串長度/截取/比較用 mb_* 函數並顯式指定編碼。
  3. 3. 資料庫欄位長度按字元數設計,應用層同步用字元單位驗證。 4. 避免在 SQL 用 LENGTH()(位元組),改用 CHAR_LENGTH()(字元數)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved