當前位置: 首頁> 最新文章列表> mb_strcut函數中字節和字符有什麼區別?這些知識你必須了解

mb_strcut函數中字節和字符有什麼區別?這些知識你必須了解

gitbox 2025-05-26

在PHP開發中,處理多字節字符串是一個常見而且容易出錯的環節。特別是當涉及到截取字符串時, mb_strcut函數經常被用來替代substr ,以避免截取多字節字符時出現亂碼問題。但很多開發者對mb_strcut中字節(byte)和字符(character)的區別存在疑惑,本文將詳細解析這兩者的差別,幫助你更好地理解和使用該函數。

1. mb_strcut函數簡介

mb_strcut是PHP多字節字符串函數庫mbstring中的一個函數,作用是截取字符串的一部分。

 string mb_strcut ( string $str , int $start [, int $length = NULL [, string $encoding = mb_internal_encoding() ]] )
  • $str :輸入字符串

  • $start :起始位置,單位是字節(byte)

  • $length :截取長度,單位也是字節(可選)

  • $encoding :字符串的編碼,默認為內部編碼

2. 字節(byte)和字符(character)的區別

  • 字節(byte) :計算機中數據存儲的基本單位,1字節=8位。一個字節可以表示一個英文字符,但對於漢字或其他多字節字符,往往需要多個字節。

  • 字符(character) :指一個完整的“符號”,無論其占用多少字節。

例如,在UTF-8編碼中,一個漢字通常佔3個字節,而一個英文字符佔1個字節。

3. mb_strcut以字節為單位截取

mb_strcut的關鍵點是它的$start$length參數都是以字節為單位的,這與其他函數(如mb_substr )不同,後者是以字符為單位。

這就意味著,如果你想截取從第3個字符開始的5個字符,用mb_strcut需要計算每個字符佔用的字節數,直接用字符索引會導致截取錯誤,甚至截取出半個多字節字符,造成亂碼。

4. 為什麼要用mb_strcut?

mb_strcut的優勢在於它保證不會截斷多字節字符的中間部分。截取時, mb_strcut會自動調整邊界,避免截斷字符的一部分,防止輸出亂碼。

舉個例子:

 <?php
$str = "你好,world!"; // "你好"兩個漢字,後面是英文和感嘆號
echo mb_strcut($str, 0, 6, "UTF-8"); 
?>

上面代碼中, 6字節長度正好是“你”和“好”兩個漢字的字節數(每個漢字3字節)。 mb_strcut會正確截取這兩個漢字,而不會截出半個字。

如果使用substr或者以字符為單位的截取函數,可能會截斷字節造成亂碼。

5. 字節單位的計算示例

了解了mb_strcut的字節單位後,我們可以通過mb_strlenmb_substr輔助計算字節數。例如:

 <?php
$str = "你好,world!";
$encoding = "UTF-8";
for ($i = 0; $i < mb_strlen($str, $encoding); $i++) {
    $char = mb_substr($str, $i, 1, $encoding);
    $byteLen = strlen(mb_convert_encoding($char, "UTF-8", $encoding));
    echo "字符 {$char} 佔用字節數: {$byteLen}\n";
}
?>

輸出:

 字符 你 佔用字節數: 3
字符 好 佔用字節數: 3
字符 , 佔用字節數: 3
字符 w 佔用字節數: 1
字符 o 佔用字節數: 1
字符 r 佔用字節數: 1
字符 l 佔用字節數: 1
字符 d 佔用字節數: 1
字符 ! 佔用字節數: 3

這表明多字節字符在UTF-8中佔用多個字節。

6. 選擇mb_strcut還是mb_substr?

  • 如果你想根據字節長度截取字符串,防止中途截斷多字節字符,應該使用mb_strcut

  • 如果你想根據字符數量截取字符串(無論每個字符佔用多少字節),應該使用mb_substr

7. 注意事項

  • 一定要指定正確的編碼,否則字節計算可能出錯。

  • 在網絡傳輸、數據庫存儲或者文件操作中,字符串字節長度往往比字符長度更重要,這時mb_strcut非常實用。

  • 如果不熟悉字節和字符的差別,容易出現截斷異常和亂碼問題。


 <?php
// 示例代碼:用mb_strcut截取UTF-8編碼字符串的前6個字節(对应兩個漢字)
$str = "你好,world!";
$cutStr = mb_strcut($str, 0, 6, "UTF-8");
echo $cutStr; // 輸出 "你好"
?>