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

PHP 字串長度計算完全指南:strlen vs mb_strlen 中英混排精準處理

     編輯:PHP 綜合知識

為什麼 strlen() 算不準中文長度?

strlen() 回傳的是位元組數,非字元數。編碼不同,一個中文字佔的位元組數不同:

  • UTF-8:1 個中文 = 3 位元組
  • GB2312/GBK:1 個中文 = 2 位元組
  • 英文/數字/符號:1 字元 = 1 位元組

因此 strlen("三知開發網") 在 UTF-8 下得到 15(5 × 3),而非 5。

mb_strlen():正確計算字元數

mb_strlen($str, 'UTF-8') 依指定編碼計算字元數,中英皆算 1。

<?php
$str = "三知sunchis開發網"; // 5 中 + 7 英 = 12 字元
echo strlen($str);           // 22 位元組 (5×3 + 7×1)
echo mb_strlen($str, "UTF-8"); // 12 字元
?>

進階技巧:不依賴 mbstring 擴充的混排長度估算

若伺服器未啟用 php_mbstring.dll,可用數學關係反推:

$bytes = strlen($str);           // 總位元組數
$chars = mb_strlen($str, 'UTF-8'); // 總字元數(需 mbstring)
// 假設只有中英混排,中文佔 3 位元組,英文佔 1 位元組
// 實際中文字數 = ($bytes - $chars) / 2
// 實際英文字數 = $chars - 中文字數

原文提供的公式 ($bytes + $chars) / 2 在純中英混排 UTF-8 下可得正確總字元數(含中文按 1 算、英文按 1 算)。

常見陷阱與最佳實踐

情境建議做法
表單驗證「最多 20 字」用 mb_strlen($input, 'UTF-8') <= 20,並明確指定編碼。
資料庫欄位長度 VARCHAR(100)MySQL utf8mb4 下 VARCHAR 計算字元數,CHAR_LENGTH() 回傳字元數,與 mb_strlen 一致。
截取字串用 mb_substr($str, 0, 20, 'UTF-8'),避免截斷多位元組字元產生亂碼。
未安裝 mbstring安裝擴充:extension=mbstring(php.ini),或用 Composer 套件 php-mbstring/polyfill。

編碼檢查清單

  1. PHP 檔案儲存為 UTF-8 無 BOM。
  2. HTML <meta charset="UTF-8">。
  3. 資料庫連線 SET NAMES utf8mb4 / PDO DSN charset=utf8mb4。
  4. mb_internal_encoding('UTF-8') 設定內部編碼,省略 mb_strlen 第二參數。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved