为什么PHP 5.4中的mb_convert_case会破坏我的字符串,而在5.2中却没有?

时间:2012-10-05 12:25:15

标签: php unicode

我有以下代码:

header('Content-type: text/html; charset=utf-8');
$str = 'áá áá';
echo $str."\n";
echo mb_convert_case($str, MB_CASE_TITLE)."\n";
echo bin2hex($str)."\n";
echo bin2hex(mb_convert_case($str, MB_CASE_TITLE))."\n";

使用PHP 5.2.2,我得到以下输出:

áá áá
áá áá
c3a1c3a120c3a1c3a1
c3a1c3a120c3a1c3a1

使用PHP 5.4.3,我得到了这个:

áá áá
á� á�
c3a1c3a120c3a1c3a1
c3a1e3a120c3a1e3a1

我在两种情况下的预期输出都是:

áá áá
Áá Áá
c3a1c3a120c3a1c3a1
c381c3a120c381c3a1

所以我有两个问题:

  1. 为什么á被转换为Á?
  2. 为什么PHP 5.4会破坏我的字符串?

1 个答案:

答案 0 :(得分:6)

$encoding传递给mb_函数的每次调用,或设置:

mb_internal_encoding("UTF-8");

确保PHP知道您正在使用的编码。否则,编码来自php.ini,或默认的ISO-8859-1(如果不包括在内)。

因此,您的5.4安装默认为ISO-8859-1,因此会降低UTF-8序列的前导字节,从而打破它。在5.2中我也是如此,所以也许你的5.2安装还有别的东西 - internal_encoding中的ini可能被设置为其他没有字母的字节位置吗?