mb_strtolower和utf8字符串

38

如您所知,在使用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来处理上述行?

2个回答

72

解决方法是告诉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' 是因为它检测到了,但是它通常是不可靠的,因为理论上无法可靠地检测任意编码的字符串。要明确知道你的字符串是以什么编码方式编码的,并显式传递这些信息。


10

简单地说,定义您自己的函数,然后在其中使用mb_detect_encoding调用mb_strtolower

$results_array = array_map(function($var) {
      return mb_strtolower($var, mb_detect_encoding($var));
}, $results_array);

3
让问题变得过于复杂了,哈哈。 - deceze

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接