substr() 按字節截取,中文(UTF-8 3 字節/字、GBK 2 字節/字)極易產生半個字符導致亂碼。mb_substr() 按字符截取,mb_strcut() 按字節截取但**不產生半字符**,均需開啟 php_mbstring.dll 擴展。
mb_substr(string $string, int $start, int $length = null, string $encoding = mb_internal_encoding()): string mb_strcut(string $string, int $start, int $length = null, string $encoding = mb_internal_encoding()): string
關鍵差異:第 4 參數**指定編碼**(如 'utf-8'、'gbk'),省略則用 mb_internal_encoding()。
<?php
header("Content-Type: text/html; charset=utf-8");
$string = "你好我好大家好"; // 7 個中文字符,UTF-8 共 21 字節
echo strlen($string) . '<br>'; // 21 (字節長度)
echo mb_substr($string, 0, 4, 'utf-8') . '...<br>'; // 你好我好... (按字符截取 4 個字)
echo mb_strcut($string, 0, 4, 'utf-8') . '...'; // 你... (按字節截取 4 字節 = 1 個字 + 1 字節 → 自動避開半字符)
?>
21 你好我好... 你...
mb_substr:**邏輯字符級**截取,start=0, length=4 取前 4 個字「你好我好」。mb_strcut:**物理字節級**截取,length=4 字節只夠 1 個中文字符(3 字節)+ 1 字節,**自動回退**到完整字符邊界,結果「你」。substr() 最大優勢。php.ini 設置 mbstring.internal_encoding = UTF-8,調用時可省略第 4 參數。mb_substr()。mb_strcut()(如數據庫 VARCHAR(100) 字節限制預截取)。mb_* 函數比 substr() 慢,極高頻調用(百萬級循環)可考慮預先轉碼或用 grapheme_substr() (intl 擴展)。extension=mbstring → Call to undefined function mb_substr()。'utf8' 而非 'utf-8')導致截取錯誤。strlen() 計算長度再傳給 mb_substr(),單位不匹配。