35

如您所知,我们需要在处理 utf-8 数据时使用mb_strtolower(),而不是:strtolower()

$str = 'برنامه';
echo strtolower($str);
----------------------
output: �����

这一切都变成了未定义的字符,现在我使用mb_strtolower()

$str = 'برنامه';
echo mb_strtolower($str);
----------------------
output: �����

仍然是相同的结果,现在:

$str = 'برنامه';
echo mb_strtolower($str,  mb_detect_encoding($str));
----------------------
output: برنامه

现在它是固定的,所以使用方法mb_strtolower是也有mb_detect_encoding.

现在我的问题是我想做同样的事情array_map

$results_array = array_map('mb_strtolower', $results_array);

我应该如何使用mb_detect_encoding上面的行?

4

2 回答 2

69

解决方案是告诉mb_strtolower您的字符串编码是什么:

echo mb_strtolower($str, 'UTF-8');

如果您不想每次都提供此参数,请为所有mb_功能设置一次:

mb_internal_encoding('UTF-8');

然后您可以调用任何mb_函数,它会将您的字符串处理为 UTF-8:

echo mb_strtolower($str); // works without second parameter now

mb_detect_encoding碰巧返回'UTF-8'是因为它检测到了它,但它通常是不可靠的,因为从概念上讲,可靠地检测任意编码的字符串是不可能的。知道你的字符串是用什么编码的,并明确地传递这些信息。

于 2012-11-08T12:09:39.487 回答
9

简单地说,定义你自己的函数,然后mb_strtolowermb_detect_encoding.

$results_array = array_map(function($var) {
      return mb_strtolower($var, mb_detect_encoding($var));
}, $results_array);
于 2012-11-08T12:09:04.273 回答