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

PHP strlen 與 mb_strlen 深度解析:字節長度 vs 字符長度

     編輯:PHP 相關知識

核心區別一覽

函數返回值含義編碼感知適用場景
strlen()字節數無(二進制安全)二進制數據、ASCII 字符串、內存佔用計算
mb_strlen()字符數有(需指定或 mb_internal_encoding)多字節字符串(中文、日文、Emoji 等)顯示長度、截取、驗證

實測對比

<?php
$str = '中文a字1符'; // UTF-8 編碼文件

echo 'strlen: '      . strlen($str) . PHP_EOL;        // 14 (中文3字節×4 + 英文1字節×2)
echo 'mb_strlen UTF-8: ' . mb_strlen($str, 'UTF-8') . PHP_EOL; // 6 (6個字符)
echo 'mb_strlen GBK: '   . mb_strlen($str, 'GBK') . PHP_EOL;   // 8 (GBK中文2字節×4 + 英文1字節×2)
echo 'mb_strlen GB2312: '. mb_strlen($str, 'GB2312') . PHP_EOL; // 10 (GB2312擴展字符差異)

// 內部編碼
echo 'internal_encoding: ' . mb_internal_encoding() . PHP_EOL; // 通常為 UTF-8

視覺寬度計算(中文佔 2,英文佔 1)

function visualWidth(string $str): int {
    // 假設 UTF-8 編碼
    $charCount = mb_strlen($str, 'UTF-8');
    $byteCount = strlen($str);
    // 中文字符在 UTF-8 佔 3 字節,英文佔 1 字節
    // 視覺寬度 = (字節數 - 字符數) / 2 * 2 + 字符數  (簡化公式)
    // 更精確:遍歷字符判斷東亞寬度
    $width = 0;
    for ($i = 0; $i < $charCount; $i++) {
        $char = mb_substr($str, $i, 1, 'UTF-8');
        $width += (preg_match('/^[\x{4e00}-\x{9fff}\x{3000}-\x{303f}\xff00-\xffef]$/u', $char)) ? 2 : 1;
    }
    return $width;
}
// 測試
echo visualWidth('中文a字1符'); // 10

常見陷阱與最佳實踐

  1. 數據庫字段長度:MySQL VARCHAR(100) 以字符為單位(取決於字符集),用 mb_strlen 驗證;VARBINARY(100) 以字節為單位,用 strlen。
  2. 截取字符串:絕不可用 substr 處理多字節字符串,必須用 mb_substr($str, 0, 10, 'UTF-8')。
  3. 正則匹配:PCRE 需 /u 修飾符支援 Unicode,如 preg_match('/^.{1,10}$/u', $str)。
  4. JSON 序列化:json_encode 輸出 UTF-8,strlen(json_encode($arr)) 計算傳輸字節數。
  5. 啟用 mbstring:Windows 取消註釋 extension=mbstring,Linux 編譯 --enable-mbstring。

總結:選型口訣

「存儲、傳輸、二進制 → strlen;
顯示、截取、驗證、業務邏輯 → mb_strlen + 顯式編碼。」

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