以下範例示範了 `substr` 和 `mb_substr` 函式的差異
1- 使用非 UTF-8 字元時,兩個函式的行為相同,並提供相同的輸出
$str = 'abcdef';
echo substr($s, 0, 3); // abc
echo mb_substr($s, 0, 3); // abc
2- 使用 UTF-8 字元時,每個函式的行為將有所不同,並提供不同的結果
2.A- `substr` 函式作用於位元組層級,並且僅適用於單位元組編碼的字元(不支援多位元組編碼)。
例如
$str_utf8 = utf8_encode("déjà_vu");
如果我們這樣做
echo substr($str_utf8, 0, 3); // dé
echo substr($str_utf8, 0, 2); // d�
=> 這是因為特殊字元「é」(和「à」)在內部是以兩個位元組編碼的
PHP 會從索引 0 開始讀取第一個位元組,它代表 `d`,然後移至第二個位元組,它是字元 `é` 的雙位元組編碼的一部分,由於長度設定為 2,PHP 將在此停止且不會繼續讀取第三個位元組,因此它無法辨識字元 `é` 並印出 � 來代替 é。
2.B- `mb_substr` 函式作用於字元層級,並且支援多位元組編碼的字元。這表示 PHP 只計算字元數,而不考慮其編碼的位元組數,例如
$str_utf8 = utf8_encode("déjà_vu");
echo mb_substr($str_utf8, 0, 4, "UTF-8"); // Déjà
echo mb_substr($str_utf8, 1, 4, "UTF-8"); // éjà_
echo mb_substr($str_utf8, 6, 4, "UTF-8"); // u
echo mb_substr($str_utf8, 7, 4, "UTF-8"); // ''
echo mb_substr($str_utf8, -2, "UTF-8"); // vu
echo mb_substr($str_utf8, -2, 1, "UTF-8"); // v
echo mb_substr($str_utf8, -2, 3, "UTF-8"); // vu