1

mongodb へのデータの挿入に問題があります。

$name = $_REQUEST['name']; // "Iñtërnâtiônàlizætiøn";
$db->table->insert(
   array('name' => $name)
);

これにより、mongo 例外が発生します。

$name = mb_convert_encoding($_REQUEST['name'], 'ISO-8859-1', 'UTF-8');

問題の解決に役立ちます。しかし、php にすべての受信データを強制的に utf-8 に設定させる方法はありますか?

私は試した

mb_internal_encoding('UTF-8');
iconv_set_encoding('input_encoding', 'UTF-8');
iconv_set_encoding('internal_encoding', 'UTF-8');

それらのどれも助けませんでした。

mb_detect_encoding($_REQUEST['title']);

与えます: 'UTF-8' しかし、mongo 例外はまだ発生します。

4

1 に答える 1

2

データがブラウザからのものである場合、ブラウザは、ページが宣言されているのと同じエンコーディングでデータを送信します。しかし、公開サーバーには任意のデータがどこからでも来る可能性があるため、何かを行う前に、受信データがすべて整形式の UTF-8 であることを常に検証する必要があります。Codeigniter のようなフレームワークがこれを行います。

ページのエンコーディングを宣言するには、Content-Type http ヘッダーを使用できます。

header("Content-Type: text/html; charset=UTF-8");

これはエンコーディングを宣言するだけで、何も UTF-8 に変換しないことに注意してください。PHP 文字列リテラルが UTF-8 であることを確認するには、PHP ソース ファイルを UTF-8 エンコーディングで保存する必要があります。

使用しないでくださいmb_detect_encoding。UTF-8 かどうかを確認するには:

if( !mb_check_encoding($str, "UTF-8"))
{
    header("HTTP/1.1 400 Bad Request");
    die("Malformed UTF-8");
}

ただし、コメントによるとmb_check_encoding、PHP <5.3 でバグがあります。

mb_check_encoding($string,'UTF-8') が無効な UTF8 バイト シーケンスに対して誤って true を返す問題は、PHP 5.2.0 と 5.2.6 の間のどこかで解決されました。

于 2013-03-23T13:55:33.633 に答える