PHP函数之substr()和mb_substr()对比
在 PHP 中,提供了两个字符串处理函数 substr() 和 mb_substr(),可以用来截取字符串中指定的一段字符。
substr() 是用于截取 ASCII 字符串的函数,mb_substr() 则是用于截取多字节字符串的函数,其中 mb 表示 multi-byte,多字节的意思。
下面来对这两个函数进行对比。
1. 参数传递方式的不同
substr(string $string, int $start [, int $length]) 函数的参数传递方式比较简单, 个参数是字符串,第二个参数是起始位置,第三个参数是可选的长度(默认情况下,它是到字符串结尾的所有字符)。
mb_substr(string $string, int $start [, int $length [, string $encoding]]) 则多了一个编码类型的参数,用来指定字符串编码类型。如果第三个可选参数省略,则会截取到字符串结尾的所有字符。
2. 字符串长度的不同
由于 mb_substr() 函数可以处理多字节字符,所以其截取字符串的长度也能够正确计算。
举个例子,如果我们有一个长度为 3 的字符串 "笑",使用 substr() 函数截取一个字符的长度时,会返回空字符串,而使用 mb_substr() 函数则会返回正确的结果。
echo substr('笑', 0, 1); // 返回空字符串
echo mb_substr('笑', 0, 1); // 返回 "笑"
3. ASCII 与多字节字符的支持
由于 substr() 函数是用于处理 ASCII 字符的,所以它不能正确处理多字节字符,在截取多字节字符时会出现问题。
而 mb_substr() 函数是专门用于截取多字节字符的,可以处理包括 UTF-8 在内的多种字符集类型。
4. 性能方面的差异
由于 mb_substr() 函数需要处理多种编码类型的字符串,因此它的性能会比 substr() 函数稍微慢一些。
但是,在处理多字符集的字符串时,mb_substr() 函数会比 substr() 函数更加准确,并且不会出现乱码和截取错误等问题。
总结
在对 ASCII 字符串进行截取时,使用 substr() 函数即可;但在对多字节字符进行截取时,必须使用 mb_substr() 函数,否则会出现截取错误和乱码等问题。
同时,如果要确保字符串截取的准确性和完整性,建议在使用 mb_substr() 函数时,一定要传递编码类型参数。
