2011-07-21 4 views
5
<head> 
<meta charset="ISO-8859-7"> 
</head> 

私はフォームを使用していて、<meta charset="ISO-8859-7">タグがテキスト領域内に入力されるテキストをエンコードしていることを確認しています。ファイルを格納するために使用されたエンコーディングメソッドがそうでないこと。 (& #D;)文字はフォーム上でどのように送信されますか?

は私がタイプされた文字が<meta charset="ISO-8859-7">タグでspeciefiedエンコーディングの一部でない場合、文字はreferencedになることを見てきました

私はフォームがバイトを送信したと仮定しました。コード化された配列は推測された。 私が何か文字を入力すると、エンコーディングが解釈するバイトになります。私は、この文字は、エンコーディングの一部ではないですが、それならば、それは、それはA5を表している位置のバイトとしてどんなにを送信する必要があります"¥"

形式で文字を入力<meta charset="ISO-8859-7"> と例えば

表現することができます(これはどのエディタでも普通に行われます)。

しかし、フォームはバイトとして送信しません。文字はreferencedです。

コード:

index.phpを

<?php header('Content-Type: text/html; charset=ISO-8859-7'); ?> 

<head> 
    <meta charset="ISO-8859-7"> 
</head> 
<form method="post" action="encode.php" accept-charset="ISO-8859-7"> 
    <p><textarea name="input" maxlength="10" rows="5" cols="100"></textarea></p> 
    <p><button>Submit</button></p> 
</form> 

encode.php:ソースコードで

<head> 
    <meta charset="ISO-8859-7"><!-- Useless, Even if is specified the ISO-8859-1 where the "¥" exist, the form sended a reference char rather an a byte to interpret.--> 
</head> 
<?php 
    $input=$_POST["input"]; 
    var_dump($input); 
?> 

結果:

string(6) "&#165;" 

注:ファイルの保存に使用されたエンコーディングの変更をテストしました。 index.phpの

: はaccept-charset=""が指定されていない場合、フォームは常にaccept-charset=""属性を持つか<meta charset="">タグとそれに応じて送信されます、ファイルを格納するために使用されているものエンコーディング問題ではありません。

encode.php: 文字列はファイルによって決してコード化されません。作業と表現が可能ですが、ファイルを格納するために使用されるエンコーディングはそれとは関係ありません。

+1

なぜUTF-8を使用しないのですか? – CuriousMind

+0

私はUTF-8を使用しますが、私はこの問題について疑問を抱いていました。 – nEAnnam

+0

'Content-Type'ヘッダが競合する文字セットを送信することはできますか? – cmbuckley

答えて

3

問題は、入力された文字がフォームエンコーディングでサポートされていないことです。

私が見る限り、HTML4もHTML5も、フォームエンコーディングでサポートされていないフォームフィールドに文字を入力すると、ブラウザが何をすべきかを指定していません。

HTML 5 はサポートされていない文字がURLs¹のクエリ部分にASCII ?で交換する必要があることを指定します(したがって、GETフォームの送信で?)、私はPOSTフォームの何かを見つけることができませんありません。

すべてのブラウザ(または少なくともIE、FF、Chrome、Opera)は、サポートされていない文字をXMLエンティティとしてエンコードすることに合意しているようです。 (より良いアプローチはおそらくユーザーに警告し、フォームの提出を防ぐことでしたが、それは橋の下の水です)。

解決策は、もちろんUTF-8をすべて使用することです。すべての文字はエンコーディングでサポートされていますが、この問題は発生しません。当該文字が符号化エンコーディングで表現できない場合、[単一は0x3Fオクテット(ASCIIの疑問符)で置き換え、


は、項目8.1 2.6.3 Resolving URLs. HTML 5, W3C Working Draft 25 May 2011を¹しました。 ..]

楽しい事実:上記はのクエリ部分(クエスチョンマークの後の部分)に適用されます10。 パスの部分は、UTF-8を使用してコード化された常にです。もちろんホスト名はPunycodeを使ってエンコードされます。心が不安になる

+0

したがって、エンコーディング文字の一部ではないフォームを受け入れる方法はありませんか? – nEAnnam

+0

そのHTML5について、サポートされていない文字を置き換える必要があることを指定します。おそらくPOSTメソッドと同じですが、その情報を参照できますか? – nEAnnam

+0

1)良い点、私は参照を追加しました。 2)フォームがフォームエンコーディングでサポートされていない文字を受け入れるための明確な方法はありません。 (フォームエンコードは、

タグで明示的に指定することも、ドキュメントのエンコードから派生させることもできます)。 –

1

また、文字セットをフォーム要素にバインドしようとしましたか?

<form method="post" action="encode.php" accept-charset="ISO-8859-7"> 

例:これはあなたのトピックをカバーしていますが、私はそれを何とか:)

+0

ありがとうございますが、上記と同じですが、私が 'utf8_decode()'関数を使っていても、フォームはバイトとして送られないので、デコードするものはありません。また、 'accept-charset =" ISO-8859-7 "についても同じ問題があります。 – nEAnnam

0

文字セットの参照がどのような詳細されているのに役立ちます願っていた場合

$input=utf8_decode($_POST["input"]); 

かなり確実ではない:あなたはUTF-8を使用する場合は、最初のポストをデコードする必要がありますブラウザはフォームに何かを入力したり、何を入力したりするのではなく、リクエストヘッダーを受け取ります(またはリクエストヘッダーを受け入れます)。

あなたが入力したものは、HTMLドキュメントの文字セット定義に関係しないと思います。重要なことは、キーボードの言語と文字の入力方法です。キーボード言語にYENサインがある場合、ブラウザはYENサインを認識し、エンティティまたは文字参照のいずれかに応じて翻訳を実行します。あなたは、YENサインを求めていました。あなたはギリシャのA5表現ではなく、円を得るでしょう。

0

これは特定の問題の原因ではない可能性がありますが、文字エンコードの不具合を覚えておいてください。同じ文字エンコードを使用してPHPスクリプトを保存してください。そうしないと、この種の問題が発生しやすくなります。

+0

はい、それは主に私が何をしているのですか、私はその問題について深刻でした。ありがとう。 – nEAnnam

関連する問題