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

だから私は2つの質問があります:

  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 に答える