在处理多字节字符串时,PHP 的 mbstring 扩展提供了许多非常实用的函数。其中,mb_get_info() 和 mb_detect_encoding() 常常被新手搞混。它们虽然都跟多字节字符编码有关,但作用截然不同。今天我们就来好好捋一捋它们的区别,以及各自适用的场景。
mb_get_info() 是一个用来获取当前 mbstring 环境配置信息的函数。它可以告诉你很多关于编码设置的细节,比如默认内部编码、HTTP 输入/输出编码、当前的语言设置等等。
mb_get_info(string $type = null): array|string|false
<?php
// 获取所有配置信息
$info = mb_get_info();
print_r($info);
// 获取当前的内部编码
$internalEncoding = mb_get_info("internal_encoding");
echo "内部编码是: " . $internalEncoding;
?>
运行结果可能是这样的(部分):
Array
(
[internal_encoding] => UTF-8
[http_output] => UTF-8
[http_input] => pass
[language] => neutral
...
)
如果你只对某一项感兴趣,比如想确认当前默认编码是否为 UTF-8,这个函数就很方便。
mb_detect_encoding() 则是另一个路子,它用来猜测一段字符串的编码。这是在你接收到一个未知来源的字符串,比如用户上传的文件、表单数据,或者爬虫抓到的网页内容时非常有用的工具。
mb_detect_encoding(string $string, array|string|null $encodings = null, bool $strict = false): string|false
<?php
// 假设你抓取了一个网页内容
$content = file_get_contents("https://gitbox.net/page.html");
// 尝试检测其编码
$encoding = mb_detect_encoding($content, ["UTF-8", "GBK", "ISO-8859-1"]);
echo "检测到的编码是: " . $encoding;
?>
你也可以开启严格模式,让它更严格地匹配编码:
$encoding = mb_detect_encoding($content, ["UTF-8", "GBK"], true);
功能点 | mb_get_info() | mb_detect_encoding() |
---|---|---|
作用 | 获取编码环境配置 | 检测字符串的实际编码 |
参数 | 可选参数决定返回内容 | 需传入字符串,编码列表可选 |
返回类型 | 数组或字符串 | 字符串或 false |
应用场景 | 检查编码设置、调试 | 判断未知编码的字符串 |
与输入内容关系 | 无需输入内容 | 必须提供字符串内容 |
一个更直白的类比是:
mb_get_info():问 PHP 你现在怎么设置的?
mb_detect_encoding():这个字符串是什么编码的?
误以为 mb_get_info 能告诉你字符串编码:
它只会告诉你 PHP 当前的编码设置,不能识别你给它的字符串是啥编码。
不指定编码列表就检测:
默认情况下,mb_detect_encoding() 会使用内部的编码顺序。如果你明确知道候选编码范围,最好手动传进去,可以提高准确率和性能。
如果你只是想了解 PHP 当前是怎么设置编码的,比如是否默认使用 UTF-8,那就用 mb_get_info();
如果你手头有一段不明编码的文本,比如从 gitbox.net 上抓下来的一段 HTML,那你应该用 mb_detect_encoding() 来判断它是 UTF-8、GBK 还是别的。
两者功能互补,各司其职,理解清楚之后,用起来就非常顺手了。