web-dev-qa-db-ja.com

Internet Explorerのフォーム送信での文字エンコードの設定

フォームを含むページがあります。このページは、コンテンツタイプtext/html; charset = utf-8で提供されます。 ISO-8859-1文字エンコードを使用してこのフォームをサーバーに送信する必要があります。これはInternet Explorerで可能ですか?

このように、accept-charset属性をフォーム要素に設定すると、Firefox、Operaなどで機能しますが、IEでは機能しません。

<form accept-charset="ISO-8859-1">
  ...
</form>

編集:このフォームはサーバーAによって作成され、サーバーBに送信されます。サーバーBを制御することはできません。

文字セットISO-8859-1でコンテンツを提供するようにサーバーAを設定した場合、すべてが機能しますが、サーバーAのエンコードを変更せずにこの機能を実現する方法を探しています。別の質問があります サーバーAのエンコーディングの設定について

59
Juha Syrjälä

これには簡単なハックがあります:

投稿する(またはGETを実行する)サーバーが受け入れる文字セットでのみ発生するエンティティを含む非表示の入力フィールドをフォームに挿入します。

例:フォームがISO-8859-1を提供するサーバー上にあり、フォームがUTF-8を期待してサーバーに投稿する場合、フォームに次のようなものを挿入します。

<input name="iehack" type="hidden" value="&#9760;" />

IEは、フォームにUTF-8文字が含まれていることを「検出」し、POSTまたはGET。ストレンジですが、機能しますが、UTF-8を使用します。

35
Trygve Lie

適切なブラウザの場合:

<form accept-charset="ISO-8859-1" .... >

IE(any):

document.charset = 'ISO-8859-1'; // do this before submitting your non-utf8 <form>!
32
dgaspar

少なくとも現在のバージョンIE(6および7))では、これはできないようです。

IEはフォーム属性accept-charsetをサポートしますが、その値が「utf-8」の場合のみです。

解決策は、サーバーAを変更して、フォームを含むページのエンコード「ISO-8859-1」を生成することです。

6
Juha Syrjälä

ここにも同じ問題があります。 UTF-8ページがあり、ISO-8859-1サーバーに投稿する必要があります。

IEはISO-8859-1を処理できません。しかし ISO-8859 -15を処理できます。

<form accept-charset="ISO-8859-15">
  ...
</form>

ISO-8859-1とISO-8859-15はほとんど同じなので、これは私にとってはうまくいきました。

5
Christian

サーバーにまったくアクセスできない場合は、その処理をUTF-8に変換します。 UTF-8以外のフォームを送信する技術は長くて残念な話です。この フォームとi18nに関するドキュメント は興味深いかもしれません。あなたは国際的なサポートを気にしていないようです。 UTF-8データをいつでもHTMLエンティティに変換して、Latin-1のままにすることができます。

2
Edward Z. Yang

同じ問題が発生しただけで、ページの文字エンコーディングを変更する必要のない比較的単純な解決策があります(お尻の痛みです)。

たとえば、サイトがutf-8にあり、iso-8859-1のサイトにフォームを投稿するとします。投稿のアクションを、投稿された値をutf-8からiso-8859-1に変換するサイトのページに変更するだけです。

これは、次のようなものを使用してphpで簡単に実行できます。

<?php
$params = array();
foreach($_POST as $key=>$value) {
    $params[] = $key."=".rawurlencode(utf8_decode($value));
}
$params = implode("&",$params);

//then you redirect to the final page in iso-8859-1
?>

ロシア語の記号「windows-1251」の場合

<form action="yourProcessPage.php" method="POST" accept-charset="utf-8">
<input name="string" value="string" />
...
</form>

単に文字列をcp1251に変換する場合

$string = $_POST['string'];
$string = mb_convert_encoding($string, "CP1251", "UTF-8");
1
dr.dimitru

マイクロソフトは accept-charset を知っているように見えますが、彼らのドキュメントは、どのバージョンが機能し始めるのかを教えてくれません...
テストしたブラウザのバージョンもわかりません。

0
PhiLho

IEの古いバージョンでは不可能だと確信しています。の前に accept-charset属性が考案され、form要素がどの文字エンコーディングを受け入れるかを指定する方法がありませんでした。ブラウザができる最善の方法は、フォームが含まれるページのエンコーディングを行うことを想定することです。

どのエンコーディングが使用されたかを知る必要があるのは少し悲しいです-今日では、Webフレームワークがそのような詳細を目に見えないように処理し、すでにデコードされているUnicode文字列としてアプリケーションにテキストデータを公開することが期待されます...

0
pdc

Accept-charsetエンコードがcontent-typeヘッダーで指定されたエンコードと一致しない場合、Internet Explorerが混乱することを覚えているようです。この例では、ドキュメントはUTF-8として送信されますが、ISO-8859-1でフォームを送信したいとします。それらを一致させてみて、問題が解決するかどうかを確認してください。

0
warp