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

PHP 計算中英混排字串長度:strlen vs mb_strlen 深度解析

     編輯:PHP 綜合知識

核心差異

函式計算單位UTF-8 中文適用場景
strlen()位元組3 位元組/字二進位資料、純 ASCII
mb_strlen()字元1 字元/字多語言文字、顯示長度計算

實測對比

$str = '中文a字1符'; // 4 中文 + 2 英數
echo strlen($str);        // 14 (4×3 + 2)
echo '<br />';
echo mb_strlen($str, 'UTF-8'); // 6

視覺寬度(佔位數)計算公式

中文字佔 2 格,英數佔 1 格,公式:

$visual_width = (strlen($str) + mb_strlen($str, 'UTF-8')) / 2;
// 範例:(14 + 6) / 2 = 10

原理推導

  • 設中文字數 = C,英數字數 = E
  • strlen = 3C + E
  • mb_strlen = C + E
  • 視覺寬度 = 2C + E = (3C+E + C+E)/2 = (strlen + mb_strlen)/2

完整工具函式

function get_visual_width($str, $encoding = 'UTF-8') {
    return (strlen($str) + mb_strlen($str, $encoding)) / 2;
}

function mb_strimwidth_visual($str, $width, $trimmarker = '...', $encoding = 'UTF-8') {
    $current = 0;
    $len = mb_strlen($str, $encoding);
    for ($i = 0; $i < $len; $i++) {
        $char = mb_substr($str, $i, 1, $encoding);
        $current += (strlen($char) > 1) ? 2 : 1;
        if ($current > $width) {
            return mb_substr($str, 0, $i, $encoding) . $trimmarker;
        }
    }
    return $str;
}

環境需求

mbstring 擴展非核心內建,需在 php.ini 啟用:

extension=mbstring

並建議設定內部編碼:

mb_internal_encoding('UTF-8');

結語

掌握 strlen(位元組)與 mb_strlen(字元)的本質差異,並善用視覺寬度公式,即可精準處理中英混排的截斷、對齊、排版等需求。

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