2024 日本 PHP 研討會

mb_strlen

(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)

mb_strlen取得字串長度

說明

mb_strlen(字串 $string, ?字串 $encoding = null): 整數

取得字串的長度。

參數

string

被檢查長度的字串。

encoding

encoding 參數是字元編碼。如果省略或為 null,則會使用內部字元編碼值。

回傳值

回傳 字串 string 中,使用 encoding 編碼的字元數。一個多位元組字元會被算作 1。

錯誤/例外

如果編碼未知,則會產生層級為 E_WARNING 的錯誤。

更新日誌

版本 說明
8.0.0 encoding 現在可以為 null。

參見

新增註記

使用者貢獻的註記 5 則註記

67
Yzmir Ramirez
13 年前
如果您不確定 $encoding 可以設定為什麼,這裡是此擴充套件支援的所有編碼的完整列表

https://php.dev.org.tw/manual/en/mbstring.supported-encodings.php
38
drake127
17 年前
mb_strlen 的速度會根據指定的字元集而有很大的差異。

如果您需要字串的位元組長度(由於 mbstring.func_overload,strlen 不再可靠),您應該使用 <?php mb_strlen($string, '8bit'); ?>
這是確定字串位元組長度的最快方法(雖然仍然比 strlen 慢很多)。其他單一位元組字元集(ASCII、ISO-8859-1 等)比 8bit 慢數倍。
12
koala at example dot com
17 年前
剛才對 mbs 函式做了一些基準測試(使用 lorem ipsum 文字 1,000,000 次)

尤其是 mb_strtolower 和 mb_strtoupper 非常慢(與普通函式相比慢了 100 倍)。其他函式也類似,但有時慢了 5 倍。

在高頻率執行的腳本中使用 mb_ 函式時要小心。

# 測試次數:1000000
# 基準測試 strlen 與 mb_strlen
# 一般 strlen:3.6795361042023 毫秒,平均:3.6795361042023E-6 毫秒
# mb_strlen:5.5934538841248 毫秒,平均:5.5934538841248E-6 毫秒
好的 1 - mb_strlen 比 strlen 慢
# mb_strlen 比 strlen 慢 1.52 倍
#
#
# 基準測試 strpos 與 mb_strpos
# 一般 strpos: 5.5523281097412 毫秒,平均:5.5523281097412E-6 毫秒
# mb_strlen: 31.180974960327 毫秒,平均:3.1180974960327E-5 毫秒
測試 2 - mb_strlen 比 strlen 慢
# mb_strpos 比 strpos 慢 5.62 倍
#
#
# 測試 substr vs. mb_substr
# 一般 substr: 3.4437320232391 毫秒,平均:3.4437320232391E-6 毫秒
# mb_strlen: 3.5374181270599 毫秒,平均:3.5374181270599E-6 毫秒
測試 3 - mb_strlen 比 strlen 慢


# mb_substr 比 substr 慢 1.03 倍
#
#
# 測試 strtolower vs. mb_strtolower
# 一般 strtolower: 4.446839094162 毫秒,平均:4.446839094162E-6 毫秒
# mb_strlen: 193.44901108742 毫秒,平均:0.00019344901108742 毫秒
測試 4 - mb_strlen 比 strlen 慢


# mb_strtolower 比 strtolower 慢 43.5 倍
#
#
# 測試 strtoupper vs. mb_strtoupper
# 一般 strtoupper: 3.0210740566254 毫秒,平均:3.0210740566254E-6 毫秒
# mb_strlen: 340.71775603294 毫秒,平均:0.00034071775603294 毫秒
測試 5 - mb_strlen 比 strlen 慢


# mb_strtoupper 比 strtoupper 慢 112.78 倍
1
Ben
16 年前
如果你發現自己沒有 mb 字串函式,而且不容易更改它,那麼針對 utf8 字元的 mb_strlen 的一個快速替代方案是使用開啟 utf8 的 PCRE 正規表示式。

$strlen = preg_match_all("/.{1}/us",$utf8string,$dummy);

這基本上是一個醜陋的權宜之計,它計算所有單個字元的匹配,而且我預計它在處理大型字串時會非常慢。
-1
David Spector
4 年前
目前尚不清楚 PHP 是否實際支援 utf-8,utf-8 是目前網頁文件的實際標準字元編碼,它支援大多數人類語言。好消息是:它確實支援。

我寫了一個測試程式,它成功讀取了一個 utf-8 檔案(無 BOM),並使用 mb_substr、mb_strlen 和 mb_strpos 來操作字元(通常應避免使用 mb_substr,因為它必須始終從字元位置 0 開始搜尋)。

使用各種 utf-8 編碼的 Unicode 測試字元(最多四個位元組長)的結果大部分是正確的,除了重音符號總是錯誤地被視為單獨的字元,而不是與前一個字元組合;必要時,可以透過程式設計來解決這個問題。
To Top