2024 年 PHP 大会日本站

mb_strlen

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

mb_strlen获取字符串长度

描述

mb_strlen(string $string, ?string $encoding = null): int

获取string的长度。

参数

string

要检查长度的string

encoding

encoding参数是字符编码。如果省略或为null,则使用内部字符编码值。

返回值

返回string string中字符的数量,其字符编码为encoding。多字节字符计为 1。

错误/异常

如果编码未知,则会生成级别为E_WARNING的错误。

变更日志

版本 描述
8.0.0 encoding现在可以为空。

参见

添加注释

用户贡献的注释 5 条注释

Yzmir Ramirez
13 年前
如果您不确定可以将 $encoding 设置为什么值,以下列出了此扩展支持的所有编码的完整列表

https://php.net/manual/en/mbstring.supported-encodings.php
drake127
17 年前
mb_strlen 的速度根据指定的字符集而变化很大。

如果您需要字符串的字节长度(由于 mbstring.func_overload,strlen 现在不可靠),您应该使用<?php mb_strlen($string, '8bit'); ?>
这是确定字符串字节长度最快的方法(尽管仍然比 strlen 慢得多)。其他单字节字符集(ASCII、ISO-8859-1 等)比 8bit 慢好几倍。
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 毫秒
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 倍
Ben
16 年前
如果您发现自己没有 mb 字符串函数,并且无法轻松更改它,那么对于 utf8 字符,mb_strlen 的快速替代方法是使用启用 utf8 的 PCRE 正则表达式。

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

这基本上是一个丑陋的技巧,它计算所有单个字符匹配,我预计它在大型字符串上的速度会非常慢。
David Spector
4 年前
可能不清楚 PHP 是否真正支持 utf-8,这是当前 Web 文档的事实上的标准字符编码,支持大多数人类语言。好消息是:它确实支持。

我编写了一个测试程序,该程序成功读取 utf-8 文件(无 BOM)并使用 mb_substr、mb_strlen 和 mb_strpos 来处理字符(通常应避免使用 mb_substr,因为它必须始终从字符位置 0 开始搜索)。

使用各种长度最长为四个字节的 utf-8 编码 Unicode 测试字符的结果大多是正确的,但重音符号总是被错误地视为单独的字符,而不是与前一个字符组合;如有必要,可以通过编程解决此问题。
To Top