當前位置: 首頁> 最新文章列表> 如何結合mb_get_info 和mb_substr 來正確截取多字節字符串

如何結合mb_get_info 和mb_substr 來正確截取多字節字符串

gitbox 2025-05-11

在PHP 中處理字符串時,如果涉及到中文、日文、韓文等多字節字符,使用常規的字符串函數(如substr )很容易出現字符截斷錯誤,導致亂碼或不完整字符。為了避免這種問題,PHP 提供了多字節字符串擴展mbstring ,其中兩個非常實用的函數是mb_get_infomb_substr

本文將通過實例,講解如何結合這兩個函數,安全而正確地截取多字節字符串。

一、 mb_get_info() :了解多字節環境信息

mb_get_info()用於獲取當前的多字節環境配置信息。通過它,我們可以知道當前使用的內部編碼是什麼,從而確保在進行字符串操作時,編碼一致。

 <?php
$info = mb_get_info();
echo "當前使用的多字節編碼是:" . $info['internal_encoding'];
?>

通常,建議在腳本開頭明確設置編碼,避免默認設置引發問題:

 <?php
mb_internal_encoding('UTF-8'); // 設置為 UTF-8
?>

二、 mb_substr() :多字節安全的字符串截取

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 問題。