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

Ale*_*lex 5 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";
Run Code Online (Sandbox Code Playgroud)

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

áá áá
áá áá
c3a1c3a120c3a1c3a1
c3a1c3a120c3a1c3a1
Run Code Online (Sandbox Code Playgroud)

使用PHP 5.4.3,我得到这个:

áá áá
á? á?
c3a1c3a120c3a1c3a1
c3a1e3a120c3a1e3a1
Run Code Online (Sandbox Code Playgroud)

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

áá áá
Áá Áá
c3a1c3a120c3a1c3a1
c381c3a120c381c3a1
Run Code Online (Sandbox Code Playgroud)

所以我有两个问题:

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

bob*_*nce 5

传入$encoding每个mb_函数调用,或设置:

mb_internal_encoding("UTF-8");
Run Code Online (Sandbox Code Playgroud)

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

因此,您的5.4安装默认为ISO-8859-1,因此降低了UTF-8序列的前导字节,打破了它.同样的情况,我在5.2,所以也许有其他关于您的安装5.2东西是不同的-也许internal_encodingini被设置到别的东西,而不在那些字节位置的信吗?