私はここに新しいので、何か悪いことをしているとすみません。
ユーザー入力を別のページに送信するフォームがあります。ユーザーはä、ö、éなどを入力する必要があります...次のすべてをドキュメントに配置しました。
_<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
header('Content-Type:text/html; charset=UTF-8');
<form action="whatever.php" accept-charset="UTF-8">
_
私も試しました:
_ini_set('default_charset', 'UTF-8');
_
他のページが読み込まれたら、次のようなユーザー入力を確認する必要があります。
_if ( $_POST['field'] == $check ) {
...
}
_
しかし、彼が「ミュンヘン」のようなものを入力した場合、PHPは「ミュンヘン」と「ミュンヘン」を比較し、たとえそうであってもTRUEをトリガーしません。それはどこでもUTF-8で指定されているので、私はサーバーがUTF-8をサポートしていないか、UTF-8に設定されていないため、サーバーが別の何かに変換していると推測します(別のスレッドで読んだときにWindows-1252)。本番環境にロードする前にローカルサーバーでApacheを使用しています。既定の設定は変更されていません(方法もわかりません)。Windows7で作業していて、ファイルをANSIでエンコードするNotepad ++で編集しています。もしbin2hex('München')
を取得すると、 '4dc3bc6e6368656e' 。
_echo $_POST['field'];
_の場合、「ミュンヘン」が正しく表示されます。
私は説明のためにあらゆる場所を調査しました、私が見つけるすべては私がすでに持っているそれらのタグ/見出しを含めるべきであることです。
どんな助けでも大歓迎です。
あなたは同時に多くの異なる問題に直面しています。最も簡単な問題から始めましょう。
問題1)echo $_POST['field'];
で正しく表示されるとおっしゃっていますか? 「ディスプレイ」とはどういう意味ですか?次の2つの場合に正しく表示されます。
したがって、echo $_POST['field'];
が正しいという事実は何の意味もありません。
問題2)使用している
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
header('Content-Type:text/html; charset=UTF-8');
これはPHPコードですか?そうである場合、バイトを送信する前にヘッダーを設定する必要があるため、エラーになります。これを行う場合、Content-Type
ヘッダーを設定しませんおよびPHPは警告を生成するはずです。
問題3)使用している
<form action="whatever.php" accept-charset="UTF-8">
一部のブラウザー(IE、ほとんどの場合)は、ASCIIまたはISO Latin-1)でデータを送信するように強制できる場合、accept-charset
を無視します。したがって、データはUTF-8で宣言されますISO Latin-1またはISO Latin-1として、ISO Latin-1として送信されます(ただし、この2番目のケースはあなたのケースではありません)。
https://stackoverflow.com/a/8547004/449288 を見て、この問題の解決方法を確認してください。
問題4)どの文字列を比較していますか?たとえば、
$city = "München"
$_POST['city'] == $city
このコードの結果は、PHPファイルのエンコードに依存します。ファイルがISO Latin-1でエンコードされており、$_POST
にUTF-8データが正しく含まれている場合、==
は異なるバイトを比較し、falseを返します。
私のphp.iniファイルで「mbstring.detect_order = pass」を変更し、私は働いた
役立つ可能性のある別のソリューションはApacheです。構成ファイル(httpd.conf)またはAddDefaultCharset
と呼ばれる.htacessにディレクティブを配置できます。次のようになります。
AddDefaultCharset utf-8
http://httpd.Apache.org/docs/2.0/mod/core.html#adddefaultcharset
それは他のデフォルトの文字セットを上書きします。
フォームとファイルでUnicode文字を何度も使用しています。今まで何の問題もありませんでした。次の手順を実行して結果を確認してください。
header('Content-Type:text/html; charset=UTF-8');
を削除します。<form action="whatever.php">
なしでaccept-charset="UTF-8"
と同じようにフォームを使用します。 (フォームタグにデータを送信するメソッドを挿入することをお勧めします)。<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
タグに<head>
を再度挿入します。私はいつもここで述べたようにプロジェクトを行い、Unicode文字列には何の問題もありませんでした。
これは、PHPファイル)の文字エンコーディングが原因です。
ハードコードされたMünchen
は、ソースファイルの文字エンコーディング(この場合はANSI
)で格納され、その値が$_POST
変数で提供されるUTF-8エンコードされた値と比較されると、2つは完全に当然、異なります。
問題の解決策は次のいずれかです。
windows-1252
。になる可能性があります。content="text/html; charset=UTF-8"
をcontent="text/html; charset=windows-1252"
に変更することが含まれます。UTF-8
とwindows-1252
の間の文字エンコードの問題の影響を受ける可能性のあるハードコードされた値はすべて避けてください。多かれ少なかれハードコード値onlyには英語の文字と数字のみが含まれます。UTF-8
の値はすべて、それらがUTF-8
でエンコードされていることを保証するソースから読み取る必要があります(たとえば、ストレージエンコーディングおよび接続エンコーディングとしてUTF-8
を使用するように設定されたデータベース)。utf8_encode()
にラップします。たとえば、$value = utf8_encode ('München');
UTF-8
。に変更します。特に複数の人がプロジェクトに関与している場合は、ソリューション1または4が私の推奨ソリューションです。
補足として、一部のテキストエディタ(特にNotepad++
)には、UTF-8
またはUTF-8 without BOM
を使用するオプションがあります。 BOM
(バイトオーダーマーク)はUTF-8
では無意味であり、PHP(ほとんどの場合、リダイレクトを行う場合)でヘッダーを書き込むときに問題が発生します。これは、BOM
は最初の<?php
の直前にあり、他の文字が前にあったのと同じようにサーバーがBOM
を送信します。違いは、前の文字に注意する点ですが、 BOM
は表示されません。
経験則:常にBOMなしでUTF-8を使用します。