web-dev-qa-db-fra.com

Définition du codage des caractères dans le formulaire soumis pour Internet Explorer

J'ai une page qui contient un formulaire. Cette page est servie avec le type de contenu text/html; charset = utf-8. Je dois soumettre ce formulaire au serveur en utilisant le codage de caractères ISO-8859-1. Est-ce possible avec Internet Explorer?

La définition de l'attribut accept-charset sur l'élément de formulaire, comme ceci, fonctionne pour Firefox, Opera etc. mais pas pour IE.

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

Modifier: ce formulaire est créé par le serveur A et sera soumis au serveur B. Je n'ai aucun contrôle sur le serveur B.

Si je configure le serveur A pour servir le contenu avec le jeu de caractères ISO-8859-1, tout fonctionne, mais je cherche un moyen de faire fonctionner cela sans modifier le codage du serveur A. J'ai une autre question sur la définition de l'encodage dans le serveur A.

59
Juha Syrjälä

Il y a un simple hack à cela:

Insérez un champ de saisie masqué dans le formulaire avec une entité qui n'apparaît que dans le jeu de caractères que le serveur que votre publication (ou faisant un GET) accepte.

Exemple: Si le formulaire se trouve sur un serveur desservant ISO-8859-1 et que le formulaire sera publié sur un serveur qui attend UTF-8, insérez quelque chose comme ceci dans le formulaire:

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

IE "détectera" alors que le formulaire contient un caractère UTF-8 et utilisera UTF-8 lorsque vous POST ou GET. Étrange, mais cela fonctionne.

35
Trygve Lie

Avec des navigateurs décents:

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

Avec IE (any):

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

Il semble que cela ne puisse pas être fait, pas au moins avec les versions actuelles de IE (6 et 7).

IE prend en charge l'attribut de formulaire accept-charset, mais uniquement si sa valeur est "utf-8".

La solution consiste à modifier le serveur A pour produire le codage "ISO-8859-1" pour la page qui contient le formulaire.

6
Juha Syrjälä

J'ai le même problème ici. J'ai une page UTF-8 et je dois poster sur un serveur ISO-8859-1.

On dirait que IE ne peut pas gérer ISO-8859-1. Mais il peut gérer ISO-8859 -15.

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

Cela a donc fonctionné pour moi, car ISO-8859-1 et ISO-8859-15 sont presque les mêmes.

5
Christian

Si vous avez un accès au serveur, convertissez son traitement en UTF-8. L'art de soumettre des formulaires non UTF-8 est une histoire longue et désolée; ceci document sur les formulaires et i18n peut être intéressant. Je comprends que vous ne semblez pas vous soucier du soutien international; vous pouvez toujours convertir les données UTF-8 en entités html pour vous assurer qu'elles restent latines-1.

2
Edward Z. Yang

Je viens de recevoir le même problème et j'ai une solution relativement simple qui ne nécessite aucun changement dans l'encodage des caractères de la page (ce qui est pénible).

Par exemple, votre site est en utf-8 et vous souhaitez publier un formulaire sur un site en iso-8859-1. Modifiez simplement l'action de la publication en une page de votre site qui convertira les valeurs publiées de utf-8 en iso-8859-1.

cela pourrait être fait facilement en php avec quelque chose comme ceci:

<?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
?>
1

Pour les symboles russes 'windows-1251'

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

Lorsque vous convertissez simplement une chaîne en cp1251

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

On dirait que Microsoft sait accept-charset , mais leur doc ne dit pas pour quelle version il commence à fonctionner ...
Vous ne dites pas non plus dans quelles versions de navigateur vous l'avez testé.

0
PhiLho

Je suis sûr que ce ne sera pas possible avec les anciennes versions d'IE. Avant le accept-charset attribut a été conçu, il n'y avait aucun moyen pour les éléments form de spécifier quel codage de caractères ils acceptaient, et le mieux que les navigateurs pouvaient faire est de supposer que le codage de la page dans laquelle le formulaire se trouve ferait.

Il est un peu triste que vous ayez besoin de savoir quel encodage a été utilisé - de nos jours, nous nous attendrions à ce que nos frameworks Web prennent en charge ces détails de manière invisible et exposent les données de texte à l'application sous forme de chaînes Unicode, déjà décodées ...

0
pdc

Je semble me souvenir qu'Internet Explorer devient confus si l'encodage accept-charset ne correspond pas à l'encodage spécifié dans l'en-tête de type de contenu. Dans votre exemple, vous prétendez que le document est envoyé au format UTF-8, mais souhaitez que le formulaire soit soumis en ISO-8859-1. Essayez de les faire correspondre et voyez si cela résout votre problème.

0
warp