4

私のスクリプトはUTF-8で記述されており、スクリプトが使用するMySQLデータベーステーブルの照合はutf8_unicode_ciです。$_GETここで、/からの文字列をスクリプト/データベースからの「内部」文字列と比較したい場合、$_POSTまたはデータベースに何かを入れたい場合、変数のエンコーディングをチェック/修正する必要がありますか、それともPHPはすでにそれを行っていますか?

前者の場合、スクリプトの最初に次のように簡単に実行できますか?

function inputToUtf8($string) {
  $detectedEncoding = mb_detect_encoding($string, 'UTF-8,ISO-8859-1', true);
  if ($detectedEncoding == 'UTF-8') {
    return $string;
  } elseif ($detectedEncoding == 'ISO-8859-1') {
    return utf8_encode($string);
  }
  throw new Exception('Invalid character encoding detected.');
}

foreach ($_GET as &$v) $v = inputToUtf8($v); unset($v);
foreach ($_POST as &$v) $v = inputToUtf8($v); unset($v);
4

2 に答える 2

2

PHPはそれを行いませんが、クライアントブラウザはそれを行うことがよくあります。HTMLページが含まれているエンコーディングでGET/POSTデータを送信するのが通常であるため、HTMLページに文字エンコーディングを正しく指定している場合、ブラウザも同じものを使用する必要があります。

もちろん、単に想定するよりも確認する方が良いです-少なくともそれについて確認する必要がある場合は。

編集:これを明確にするために-あなたが期待している文字セットと一致しない文字を除外することを意味していることを確認することによって。一度に1つの文字セットのみを設定、期待、およびサポートする必要があります。

于 2013-03-04T21:05:45.170 に答える
1

次の理由により、エンコーディングを検出しないことをお勧めします。

  • 正常に動作するすべての Web ブラウザは、ページと同じエンコーディングでデータを送信しています。例外なく。
  • エンコーディングの検出は 100% 正確ではありません。文字列は複数のエンコーディングで有効である可能性があり (通常は有効です)、間違ったエンコーディングが検出され、変換が混乱する可能性があります。
于 2013-03-04T21:44:29.770 に答える