2012-03-22 5 views
9

私はutf8_decode()の動作について混乱しています。それが大丈夫だと思う。私のスクリプトは正常に動作しますが、なぜ私はutf8_decode()を使用する必要があるのか​​混乱しています。

ここで私はいくつかのテキストをキャプチャし、(utf8_general_ciの照合を使用しています)私のMySQLデータベースに保存するために使用している単純なHTMLフォームです:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
</head> 
<body> 
<form action="update.php" method="post" accept-charset="utf-8"> 
<p> 
    Title: <input type="text" name="title" id="title" accept-charset="utf-8" size="75" value="" /> 
</p> 
<p> 
    <input type="submit" name="submit" value="Submit" /> 
</p> 
</form> 
</body> 
</html> 

あなたは、私はこのコード化を持って見ることができるように適切な場所にcharset = utf8と入力してください。発音欄(例:ñ、óなど)を含むテキストを受け入れます。最後に、すべてのテキスト入力に対して小さなスクリプトを実行して発音区別を確認し、HTMLエンティティに変更します(例:ñは& ntildeになります)。

私のスクリプトで入力が受け取られたら、まずutf8_decode($ input)を実行してから、私の小さなスクリプトを実行して必要な分音符号をチェックして変更しなければなりません。すべてうまく動作します。なぜ私はこの入力でデコードを実行しなければならないのか不思議です。私はutf8_decodeがUTF-8でコード化された文字列をISO-8859-1に変換することを理解しています。私はすべてがうまく動く(または私が考える) - 私は後で私に追いつく何かをやっていないよ - を確認したい。たとえば、ISO-8859-1でエンコードされた文字をデータベースに格納して送信し、UTF-8文字を格納/配信するように設定されているとします。私のdiacritics-to-entitiesスクリプトが返す文字列にutf8_encode()を実行するような何かをする必要がありますか?例:

​​

これについて誰でも洞察してください。

+5

「それがうまくいく」ことができない – bernie

答えて

0

accept-charset = "utf-8"でフォームを送信すると、ブラウザはフォームデータをutf-8でエンコードされたISO-8859-1文字でサーバーに送信します。 utf8_decodeは、エンコードされたデータのバクトを厳密なISO-8859-1に変換します。たとえば、 "ñ"を送信すると、utf-8エンコーディングはフォームアクションに "%F1"を送信します。これは、スクリプトを動作させるために "ñ"に変換する必要があります。

0

utf-8で表示するテキストを表示するページが表示されますが、accept-charset = "utf-8"を使用してutf8に切り替えても、サーバーはiso-8859-1にコンサートしてからそれが表示されたら、それはiso-8859-1からutf-8に再び変換されますが、utf-8のみのcharを変換することができたので、奇妙な文字を表示して終了し、このプロセスをループするたびに悪いと悪いので、私はあなたがHTML側ですべてを行うにもかかわらず、それがutf - 8を読むためにサーバー上でそれを切り替える方法ではないので、すべてを切り替えることはできませんutf- 8。それは、私が知りたいと思う方法がある場合は、Apacheにあります。

1

「accept-charset」は使用しないでください。壊れている。ほとんどのブラウザでは、自分のhttp要求での送信が中止されています。いくつかのブラウザ(IE)はフォームを解析するときにこの属性を完全に無視し、他のブラウザは非常に限定された仕事をします。実際には、 "accept-charset"は良いよりも害を及ぼすでしょう。

ブラウザはフォームを受信したのと同じエンコードでデータを送信します。ページがUTF-8として送信されていることを確認してください。 HTMLの頭のメタタグでは不十分です。 PHPページの場合、この設定は3つの場所で設定できます:

  • "head"のHTMLタグ<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />です。
  • Apache設定のAddDefautCharset UTF8行(または他のWebサーバーと同様のもの)。
  • header("Content-type=text/html; charset=utf-8");へのPHPコール(ページに何かが表示される前)。

各ディレクティブは前のディレクティブよりも優先されます。したがって、サーバーがすでに文字セットを宣言している場合、メタタグは無視されます。

だからあなたがする必要があります

  • はもちろん、あなたのソースファイルはUTF-8であることを確認します。
  • HTMLソースを修正して、W3Cで検証します。たとえば、メタタグはXHTMLで閉じなければなりません。
  • 「accept-charset」属性を削除します。
  • 最終的に、ApacheまたはPHPのheader()でエンコード宣言を強制します。
  • サーバーから受信したHTTPヘッダーに正しいエンコードが宣言されていることを確認します(メタタグを使用している場合はエンコードなし)。 Linuxの場合curl -I <URL>はHTTPヘッダーのみを表示します。
関連する問題