在 PHP 中处理多字节字符串(如中文、日文、韩文等)时,使用标准的字符串函数(如 strlen)往往会导致意想不到的结果。因为这些函数是以字节为单位进行计算,而不是以字符为单位。这时候,我们就需要借助 PHP 的 Multibyte String 扩展(mbstring)中的函数,如 mb_strlen 和 mb_get_info 来实现更精确的字符串操作。
本文将带你了解 mb_strlen 和 mb_get_info 的基本用法,并通过实例说明它们如何帮助你准确检测多字节字符串的长度。
先看一个简单例子:
$str = "你好,世界";
echo strlen($str); // 输出:15
这个字符串明明只有 5 个汉字(包含逗号),却返回了 15。这是因为在 UTF-8 编码下,一个汉字通常占用 3 个字节。strlen 统计的是“字节数”,而不是“字符数”。
如果我们要得到真正的字符数,应该使用 mb_strlen:
echo mb_strlen($str); // 输出:5
这样我们才得到了正确的字符数量。
mb_strlen 是专门为多字节字符设计的函数,语法如下:
int mb_strlen ( string $str [, string $encoding = mb_internal_encoding() ] )
$str:要测量长度的字符串
$encoding:可选,指定编码类型,默认使用 mb_internal_encoding() 返回的编码
示例:
$str = "欢迎访问 https://gitbox.net";
$length = mb_strlen($str, 'UTF-8');
echo "字符长度为:$length";
输出:
字符长度为:18
这会正确统计中文和英文混合字符串中的“字符数”,而不是字节数。
mb_get_info 可以帮助你了解当前 mbstring 配置,尤其是内部编码方式:
$info = mb_get_info();
print_r($info);
输出示例:
Array
(
[internal_encoding] => UTF-8
[http_input] => pass
[http_output] => pass
[language] => neutral
[encoding_translation] => 0
...
)
这告诉我们当前使用的是 UTF-8 编码。如果你发现 mb_strlen 计算结果不准确,检查一下内部编码是否设置正确是很有帮助的。
你也可以指定返回特定的信息:
echo mb_get_info("internal_encoding"); // 输出:UTF-8
为避免问题,建议在脚本开头设置默认的多字节编码:
mb_internal_encoding("UTF-8");