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

PHP mb_substr() / mb_strcut() 截取中文字符串實戰指南(避開亂碼坑)

     編輯:PHP 綜合知識

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() 最大優勢。

最佳實踐建議

  1. 統一編碼: 項目全站 UTF-8,php.ini 設置 mbstring.internal_encoding = UTF-8,調用時可省略第 4 參數。
  2. 語義選擇:
    • 需要「前 N 個字」→ mb_substr()。
    • 需要「限制存儲字節數、不破壞字符」→ mb_strcut()(如數據庫 VARCHAR(100) 字節限制預截取)。
  3. 性能提示: mb_* 函數比 substr() 慢,極高頻調用(百萬級循環)可考慮預先轉碼或用 grapheme_substr() (intl 擴展)。

常見錯誤避坑

  • 忘記開啟 extension=mbstring → Call to undefined function mb_substr()。
  • 編碼參數寫錯(如 'utf8' 而非 'utf-8')導致截取錯誤。
  • 混用 strlen() 計算長度再傳給 mb_substr(),單位不匹配。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved