15

私はここで新しいので、何か間違ったことをしていたら申し訳ありません。

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

<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 ) {
  ...
}

しかし、'München' のようなものを入力すると、PHP は 'München' と 'München' を比較し、TRUE をトリガーする必要がありますが、TRUE をトリガーすることはありません。どこでもUTF-8が指定されているため、UTF-8をサポートしていないか構成されていないため、サーバーが別のもの(別のスレッドで読んだWindows-1252)に変換していると推測しています。本番環境にロードする前に、ローカル サーバーで Apache を使用しています。デフォルト設定を変更していません (また、変更方法もわかりません)。私はWindows 7で作業しており、ファイルをANSIでエンコードしてNotepad ++で編集しています。bin2hex('München')「4dc3bc6e6368656e」を取得した場合。

I の場合echo $_POST['field'];、「München」が正しく表示されます。

私は説明のためにあらゆる場所を調査しましたが、私が見つけたのは、既に持っているタグ/見出しを含める必要があるということだけです.

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

4

5 に答える 5

14

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

問題 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)accept-charsetは、データを強制的に ASCII または ISO Latin-1 で送信できるかどうかを無視します。したがって、データは 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 を返します。

于 2012-02-04T15:28:59.120 に答える
3

役立つ可能性のある別の解決策は Apache です。構成ファイル (httpd.conf) または .htacess に .htacess というディレクティブを配置できますAddDefaultCharset。次のようになります。

AddDefaultCharset utf-8

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

これにより、他のデフォルトの文字セットが上書きされます。

于 2012-01-25T12:35:59.110 に答える
3

php.ini ファイルで「mbstring.detect_order = pass」を変更して、作業しました

于 2016-03-09T07:06:06.137 に答える
0

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

  1. header('Content-Type:text/html; charset=UTF-8');HTML フォーム コードから削除します。
  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 文字列に問題はありませんでした。

于 2012-01-25T12:34:16.613 に答える
0

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

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

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

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

特にプロジェクトに複数の人が関与している場合は、解決策 1 または 4 のいずれかが私の好ましい解決策です。

補足として、一部のテキスト エディター (特に) には、 または のいずれかNotepad++を使用するオプションがあります。(バイト オーダー マーク) は意味がなく、PHP でヘッダーを記述するとき (ほとんどの場合、リダイレクトを行うとき) に問題が発生します。これは、が頭文字の のすぐ前にあるためです。サーバーは、他の文字が前にある場合と同様に を送信します。違いは、前に文字が表示されますが、表示されないことです。 経験則:常に BOM なしの UTF-8 を使用してください。UTF-8UTF-8 without BOMBOMUTF-8BOM<?phpBOMBOM

于 2012-01-26T08:30:13.947 に答える