web-dev-qa-db-ja.com

$ _POSTはutf-8からöüなどに変換します

私はここに新しいので、何か悪いことをしているとすみません。

ユーザー入力を別のページに送信するフォームがあります。ユーザーはä、ö、éなどを入力する必要があります...次のすべてをドキュメントに配置しました。

_<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'];_の場合、「ミュンヘン」が正しく表示されます。

私は説明のためにあらゆる場所を調査しました、私が見つけるすべては私がすでに持っているそれらのタグ/見出しを含めるべきであることです。

どんな助けでも大歓迎です。

13
lungov

あなたは同時に多くの異なる問題に直面しています。最も簡単な問題から始めましょう。

問題1)echo $_POST['field'];で正しく表示されるとおっしゃっていますか? 「ディスプレイ」とはどういう意味ですか?次の2つの場合に正しく表示されます。

  • フィールドがUTF-8であり、ページがUTF-8として宣言されていて、ブラウザーがそれをUTF-8として表示している、または
  • フィールドはLatin-1であり、ブラウザーは(自動検出ヒューリスティックにより)ページがLatin-1であると判断しました。

したがって、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を返します。

14
gioele

私のphp.iniファイルで「mbstring.detect_order = pass」を変更し、私は働いた

3
ujjwal singh

役立つ可能性のある別のソリューションはApacheです。構成ファイル(httpd.conf)またはAddDefaultCharsetと呼ばれる.htacessにディレクティブを配置できます。次のようになります。

AddDefaultCharset utf-8

http://httpd.Apache.org/docs/2.0/mod/core.html#adddefaultcharset

それは他のデフォルトの文字セットを上書きします。

3
Jeremy Harris

フォームとファイルでUnicode文字を何度も使用しています。今まで何の問題もありませんでした。次の手順を実行して結果を確認してください。

  1. HTMLフォームコードからheader('Content-Type:text/html; charset=UTF-8');を削除します。
  2. <form action="whatever.php">なしでaccept-charset="UTF-8"と同じようにフォームを使用します。 (フォームタグにデータを送信するメソッドを挿入することをお勧めします)。
  3. ターゲットページ(whatever.php)で、<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">タグに<head>を再度挿入します。

私はいつもここで述べたようにプロジェクトを行い、Unicode文字列には何の問題もありませんでした。

0
Mohammad Saberi

これは、PHPファイル)の文字エンコーディングが原因です。

ハードコードされたMünchenは、ソースファイルの文字エンコーディング(この場合はANSI)で格納され、その値が$_POST変数で提供されるUTF-8エンコードされた値と比較されると、2つは完全に当然、異なります。

問題の解決策は次のいずれかです。

  1. ソースファイルと同じエンコーディングでコンテンツを提供および処理します。この場合、windows-1252。になる可能性があります。
    • 手始めに、これには、HTMLデータを提供するたびにcontent="text/html; charset=UTF-8"content="text/html; charset=windows-1252"に変更することが含まれます。
  2. UTF-8windows-1252の間の文字エンコードの問題の影響を受ける可能性のあるハードコードされた値はすべて避けてください。多かれ少なかれハードコード値onlyには英語の文字と数字のみが含まれます。
    • UTF-8の値はすべて、それらがUTF-8でエンコードされていることを保証するソースから読み取る必要があります(たとえば、ストレージエンコーディングおよび接続エンコーディングとしてUTF-8を使用するように設定されたデータベース)。
  3. すべてのハードコードされた割り当てをutf8_encode()にラップします。たとえば、$value = utf8_encode ('München');
  4. ソースファイルのエンコーディングをUTF-8。に変更します。
    • これはさまざまな方法で実現できます。まともなテキストエディターで実行できます。特にバッチ処理では、優れた libiconv を使用できます。

特に複数の人がプロジェクトに関与している場合は、ソリューション1または4が私の推奨ソリューションです。

補足として、一部のテキストエディタ(特にNotepad++)には、UTF-8またはUTF-8 without BOMを使用するオプションがあります。 BOM(バイトオーダーマーク)はUTF-8では無意味であり、PHP(ほとんどの場合、リダイレクトを行う場合)でヘッダーを書き込むときに問題が発生します。これは、BOMは最初の<?phpの直前にあり、他の文字が前にあったのと同じようにサーバーがBOMを送信します。違いは、前の文字に注意する点ですが、 BOMは表示されません。
経験則:常にBOMなしでUTF-8を使用します。

0
zrvan