当前位置: 首页> 最新文章列表> 如何结合 mb_get_info 与 mb_strlen 进行字符串长度检测

如何结合 mb_get_info 与 mb_strlen 进行字符串长度检测

gitbox 2025-05-11

在 PHP 中处理多字节字符串(如中文、日文、韩文等)时,使用标准的字符串函数(如 strlen)往往会导致意想不到的结果。因为这些函数是以字节为单位进行计算,而不是以字符为单位。这时候,我们就需要借助 PHP 的 Multibyte String 扩展(mbstring)中的函数,如 mb_strlenmb_get_info 来实现更精确的字符串操作。

本文将带你了解 mb_strlenmb_get_info 的基本用法,并通过实例说明它们如何帮助你准确检测多字节字符串的长度。

一、为什么不能直接用 strlen

先看一个简单例子:

$str = "你好,世界";
echo strlen($str);  // 输出:15

这个字符串明明只有 5 个汉字(包含逗号),却返回了 15。这是因为在 UTF-8 编码下,一个汉字通常占用 3 个字节。strlen 统计的是“字节数”,而不是“字符数”。

如果我们要得到真正的字符数,应该使用 mb_strlen

echo mb_strlen($str);  // 输出:5

这样我们才得到了正确的字符数量。

二、使用 mb_strlen 精确计算字符长度

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 获取编码信息?

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");

这样可以确保 mb_strlenmb_substr 等函数都按 UTF-8 编码来处理字符串。