2013-04-06 5 views
5

stackoverflowを含むインターネット上では、PHPをUTF-8エンコーディングで動作させるには、mb_http_input( 'utf-8')を使用することをお勧めします。たとえば、PHP/MySQL encoding problems. â�� instead of certain charactersを参照してください。一方、PHPマニュアルでは、PHPスクリプト内で入力エンコーディングを修正することはできないとし、mb_http_inputはそれを設定する方法ではなく、それを照会するための手段にすぎないと言います。 http://www.php.net/manual/en/mbstring.http.phpおよびhttp://php.net/manual/en/function.mb-httpetinput.phpを参照してください。これは質問の前の文脈を明確にしただけです。 Apache + PHP + HTMLには、入力エンコーディングから内部エンコーディング、そして最後に出力エンコーディングへの変換を制御するための冗長なコマンドがたくさんあるようです。私はこれの有用性を理解していない。たとえば、ある外部HTTPクライアントからの元の入力エンコーディングがEUC-JPで、内部エンコーディングをUTF-8に設定した場合、PHPは変換を行う必要があります。私は正しい?私が正しいとすれば、なぜ、utf-8の内部エンコーディングにすぐに変換されるのであれば、(元のものを渡すのではなく)php.iniで入力エンコーディングを設定するのはなぜですか?同様の質問が出力を保持します。私のすべてのhtppファイルでは、charset = utf-8のメタタグを使用します。したがって、出力HTTPエンコーディングは固定されています。さらに、PHP.iniでは、HTTPヘッダーにutf-8と表示されるdefault_charsetを設定できます。最終的な出力エンコーディングがすでに修正されている場合、mb_http_output( 'uft-8')を使用するのはなぜでしょうか?要約すると、mb_http_output( 'uft-8')が明らかに必要であり、Dreamweaverなどのエディタにデフォルトで挿入されるより一般的なコマンドに置き換えることはできません。mb_http_output()の有用性は、出力エンコーディングが通常他の手段で固定されている場合ですか?

+2

スタックオーバーフローの文字エンコーディングを扱う答えは、部分的または完全に間違っているか、または回答の作成者が明確に理解できず、盲目的に何かが正しく動作しているように見えますが、実際はそうではありません。回答者は信頼できる方法で正しく取得している人はほとんどいません。 – Esailija

答えて

9

これらの2つのオプションは、PHPデザイナーが今までに持っていた最悪のアイデアに関するものであり、エンコーディングに関しては多分悪い考えを持っていました。文字列に特定のエンコーディングに変換するには

、1は1つがからを変換しているものエンコーディング知っている必要があります。着信データは、多くの場合、宣言されていないエンコーディングです。サーバーはちょうどいくつかのバイナリデータを受信しますが、それが表すエンコーディングはわかりません。フォーム上にaccept-charset属性を設定すると、ブラウザが送信するエンコードを宣言する必要があります。そうすることは、ブラウザがそうすることを保証するものではなく、PHPがどのようなエンコーディングを期待するかをPHPに知らせることにはなりません。

同じことが出力されます。 PHP文字列は単なるバイト配列であり、関連するエンコーディングはありません。私は、入力時に任意の文字列を特定のエンコーディングに変換する方法をPHPがどのように認識しているかは知らない。または出力。

あなたはこれを手動で処理する必要があり、それはとにかくやることは本当に簡単です:入力がmb_check_encoding(ない_detect encodingまたはそのようないくつかの、ちょうどチェック)を使用して、正しいエンコーディングであるかどうかチェック、あなたが期待するものエンコーディングのクライアントに宣言します無効な入力を拒否し、アプリケーションフロー全体の中ですべてを同じエンコーディングに保つように注意してください。つまり、あなたのアプリではの変換はありません。

あなたはを行う場合はUnicodeのサンドイッチ作り、任意の時点で変換する必要があります:出力に戻って所望の出力エンコーディングに変換し、UTF-8または入力上の別のUnicodeエンコーディングに予想されるエンコーディングからの入力を変換します。変換する必要がある場合はいつでも、からに変換していることを確認してください。 1つの宣言で魔法のように "すべての文字列をUTF-8にする"ことはできません。

+0

この規格はどうなっていますか:http://www.w3.org/International/O-HTTP-charset.en.php?それは役に立ちませんか? –

+0

@ Dominic108確かに便利です。これは*ブラウザに*ページのエンコーディングと宣言します*これを設定する必要があります。これは私が上に書いた何も変わらない。詳細については、[WebアプリケーションでUnicodeフロントを処理する](http://kunststube.net/frontback/)を参照してください。 – deceze

+0

私は、IE 9は、フォームにaccept-charset = "UTF-8"を指定しても、送信するヘッダーに文字セットを含めないことに気付きました。あなたが書いたことに反対してこれを言っているわけではありません。ちょうどそれに気づく。 –

関連する問題