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

PHP mb_strimwidth / mb_strwidth 完美解決中英混排字串截取(按視覺寬度而非字節)

     編輯:PHP 綜合知識

核心函式介紹

函式用途關鍵參數
mb_strwidth($str, $encoding)取得字串視覺寬度(中文=2, 英文=1)$encoding 指定編碼(如 UTF-8)
mb_strimwidth($str, $start, $width, $trimmarker, $encoding)按視覺寬度截取,可附加尾標$width 目標寬度,$trimmarker 如 ...
mb_strlen($str, $encoding)取得字元數(中英皆計 1)
mb_substr($str, $start, $length, $encoding)按字元數截取

實戰範例:按視覺寬度截取並加省略號

<?php
$str = 'aaaa啊啊aaaa啊啊啊aaa'; // 4英 + 2中 + 4英 + 3中 + 3英

// 1. 取得視覺寬度:英文1、中文2
echo mb_strwidth($str, 'utf-8'); // 輸出 20 (4*1 + 2*2 + 4*1 + 3*2 + 3*1 = 20)

// 2. 寬度超過 10 才截取
if (mb_strwidth($str, 'utf-8') > 10) {
    // 從 0 開始,取寬度 10,尾巴加 '...',編碼 utf-8
    // 注意:尾巴 '...' 寬度 3 也計入 10 內
    $str = mb_strimwidth($str, 0, 10, '...', 'utf-8');
}

echo $str; // 輸出:aaaa啊...
/*
解析:
a a a a = 4
啊     = 2  (累計 6)
...   = 3  (累計 9)
下一個「啊」需 2 寬度會超過 10,故停止。
結果寬度 9,符合預期。
*/
?>

對比:mb_strlen/mb_substr 按字元數截取

<?php
$str = 'aa12啊aa';
echo strlen($str);           // 9 字節
echo mb_strlen($str, 'utf-8'); // 7 字元 (a a 1 2 啊 a a)
echo mb_substr($str, 0, 5, 'utf-8'); // aa12啊 (前 5 字元)
?>

差異:mb_strlen/substr 視中英為同等長度;mb_strwidth/imwidth 視中文佔 2 格、英文 1 格,適合「對齊顯示、固定寬度欄位」場景。

編碼設定最佳實踐

<?php
// 全域設定(建議放在 bootstrap/entry)
mb_internal_encoding('UTF-8');
mb_regex_encoding('UTF-8');
mb_http_output('UTF-8');
// 之後所有 mb_* 函式可省略 $encoding 參數
?>

適用場景

  • 列表標題、摘要固定寬度顯示(後台管理、前端卡片)。
  • Excel/CSV 匯出欄位寬度預估。
  • 終端機 CLI 表格對齊。
  • 郵件/簡訊字數計費(中文算 2 字)。

總結

拋棄 substr + strlen 手動判斷中英文位元組的寫法,mb_strimwidth / mb_strwidth 才是處理中英混排截取的標準解,簡潔、正確、效能佳。

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