如果您不确定可以将 $encoding 设置为什么值,以下列出了此扩展支持的所有编码的完整列表
https://php.net/manual/en/mbstring.supported-encodings.php
(PHP 4 >= 4.0.6, PHP 5, PHP 7, PHP 8)
mb_strlen — 获取字符串长度
返回string string
中字符的数量,其字符编码为encoding
。多字节字符计为 1。
如果编码未知,则会生成级别为E_WARNING
的错误。
版本 | 描述 |
---|---|
8.0.0 |
encoding 现在可以为空。 |
如果您不确定可以将 $encoding 设置为什么值,以下列出了此扩展支持的所有编码的完整列表
https://php.net/manual/en/mbstring.supported-encodings.php
mb_strlen 的速度根据指定的字符集而变化很大。
如果您需要字符串的字节长度(由于 mbstring.func_overload,strlen 现在不可靠),您应该使用<?php mb_strlen($string, '8bit'); ?>。
这是确定字符串字节长度最快的方法(尽管仍然比 strlen 慢得多)。其他单字节字符集(ASCII、ISO-8859-1 等)比 8bit 慢好几倍。
刚刚对 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 毫秒
ok 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 毫秒
ok 2 - mb_strlen 比 strlen 慢
# mb_strpos 比 strpos 慢 5.62 倍
#
#
# 对比 substr 和 mb_substr 的基准测试
# 普通 substr:3.4437320232391 毫秒,平均值:3.4437320232391E-6 毫秒
# mb_strlen:3.5374181270599 毫秒,平均值:3.5374181270599E-6 毫秒
ok 3 - mb_strlen 比 strlen 慢
# mb_substr 比 substr 慢 1.03 倍
#
#
# 对比 strtolower 和 mb_strtolower 的基准测试
# 普通 strtolower:4.446839094162 毫秒,平均值:4.446839094162E-6 毫秒
# mb_strlen:193.44901108742 毫秒,平均值:0.00019344901108742 毫秒
ok 4 - mb_strlen 比 strlen 慢
# mb_strtolower 比 strtolower 慢 43.5 倍
#
#
# 对比 strtoupper 和 mb_strtoupper 的基准测试
# 普通 strtoupper:3.0210740566254 毫秒,平均值:3.0210740566254E-6 毫秒
# mb_strlen:340.71775603294 毫秒,平均值:0.00034071775603294 毫秒
ok 5 - mb_strlen 比 strlen 慢
# mb_strtoupper 比 strtoupper 慢 112.78 倍
如果您发现自己没有 mb 字符串函数,并且无法轻松更改它,那么对于 utf8 字符,mb_strlen 的快速替代方法是使用启用 utf8 的 PCRE 正则表达式。
$strlen = preg_match_all("/.{1}/us",$utf8string,$dummy);
这基本上是一个丑陋的技巧,它计算所有单个字符匹配,我预计它在大型字符串上的速度会非常慢。
可能不清楚 PHP 是否真正支持 utf-8,这是当前 Web 文档的事实上的标准字符编码,支持大多数人类语言。好消息是:它确实支持。
我编写了一个测试程序,该程序成功读取 utf-8 文件(无 BOM)并使用 mb_substr、mb_strlen 和 mb_strpos 来处理字符(通常应避免使用 mb_substr,因为它必须始终从字符位置 0 开始搜索)。
使用各种长度最长为四个字节的 utf-8 编码 Unicode 测试字符的结果大多是正确的,但重音符号总是被错误地视为单独的字符,而不是与前一个字符组合;如有必要,可以通过编程解决此问题。