在PHP 中處理字符串時,如果涉及到中文、日文、韓文等多字節字符,使用常規的字符串函數(如substr )很容易出現字符截斷錯誤,導致亂碼或不完整字符。為了避免這種問題,PHP 提供了多字節字符串擴展mbstring ,其中兩個非常實用的函數是mb_get_info和mb_substr 。
本文將通過實例,講解如何結合這兩個函數,安全而正確地截取多字節字符串。
mb_get_info()用於獲取當前的多字節環境配置信息。通過它,我們可以知道當前使用的內部編碼是什麼,從而確保在進行字符串操作時,編碼一致。
<?php
$info = mb_get_info();
echo "當前使用的多字節編碼是:" . $info['internal_encoding'];
?>
通常,建議在腳本開頭明確設置編碼,避免默認設置引發問題:
<?php
mb_internal_encoding('UTF-8'); // 設置為 UTF-8
?>
mb_substr()是substr()的多字節版本,用於從字符串中截取指定長度的子串,支持多種字符編碼,避免字符被錯誤地一刀切。
語法如下:
mb_substr(string $string, int $start, ?int $length = null, ?string $encoding = null): string
參數解釋:
$string :原始字符串
$start :起始位置(從0 開始)
$length :可選,截取的長度
$encoding :可選,指定編碼(建議明確寫出)
假設我們從一段UTF-8 編碼的中文文章中截取前50 個字符作為摘要:
<?php
mb_internal_encoding('UTF-8'); // 明確指定編碼
$article = "PHP 是一種廣泛應用的開放源代碼的多用途腳本語言,尤其適用於 Web 開發並可嵌入 HTML 中。";
// 截取前 50 個字符
$summary = mb_substr($article, 0, 50);
echo "文章摘要:" . $summary;
?>
輸出結果不會亂碼,因為mb_substr會以字符為單位處理,而不是以字節為單位。
比如用戶提交一段評論,我們想在展示列表中只顯示前30 個字符,並提供“閱讀全文”鏈接:
<?php
mb_internal_encoding('UTF-8');
$comment = "這是用戶提交的一段非常精彩的評論,我們希望只顯示部分內容。";
$preview = mb_substr($comment, 0, 30);
echo $preview . '... <a href="https://gitbox.net/full-comment.php?id=123">閱讀全文</a>';
?>
這樣做不僅可以避免頁面因超長內容變得臃腫,也保障了字符的完整顯示。
如果你要處理的是GBK、BIG5 等其他編碼,記得在每個mb_函數中明確指定編碼參數。
mb_strlen()也可以搭配使用,用於判斷截取前是否有必要(比如只有20 字符時,不必截取30)。
在HTML 環境中輸出截取內容時,還要注意轉義,避免XSS 問題。