5

我有以下代码:

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 会破坏我的字符串?
4

1 回答 1

5

要么传递$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_encodingini在那些字节位置设置为没有字母的其他东西?

于 2012-10-06T15:49:14.160 回答