Question

J'écris une extension Chrome qui fonctionne avec un site Web qui utilise la norme ISO-8859-1. Juste pour donner un contexte, ce que mon extension ne fait l'affichage dans les forums du site plus rapide en ajoutant une forme post plus pratique. La valeur de la zone de texte où le message est écrit est ensuite envoyé par un appel Ajax (en utilisant jQuery).

Si le message contient des caractères tels que á ces caractères apparaissent comme á dans le message affiché. Forcer le navigateur pour afficher UTF-8 au lieu de l'ISO-8859-1 fait l'á apparaissent correctement.

Je crois comprendre que Javascript utilise UTF-8 pour ses chaînes, il est donc ma théorie que si je transcoder la chaîne ISO-8859-1 avant de l'envoyer, il faut résoudre mon problème. Cependant, il semble y avoir aucun moyen direct de faire en Javascript transcoder, et je ne peux pas toucher le code côté serveur. Un conseil?

Je l'ai tenté de mettre la forme créée pour utiliser iso-8859-1 comme ceci:

var form = document.createElement("form");
form.enctype = "application/x-www-form-urlencoded; charset=ISO-8859-1";

Et aussi:

var form = document.createElement("form");
form.encoding = "ISO-8859-1";

Mais cela ne semble pas fonctionner.

EDIT:

Le problème a menti en fait dans la façon dont jQuery a été urlencodage le message (ou quelque chose le long du chemin), je fixe en racontant jQuery ne pas traiter les données et les faire moi-même comme le montre l'extrait suivant:

function cfaqs_post_message(msg) {
  var url = cfaqs_build_post_url();
  msg = escape(msg).replace(/\+/g, "%2B");
  $.ajax({
    type: "POST",
    url: url,
    processData: false,
    data: "message=" + msg + "&post=Preview Message",
    success: function(html) {
      // ...
    },
    dataType: "html",
    contentType: "application/x-www-form-urlencoded"
  });
}
Était-ce utile?

La solution

  

Je crois comprendre que Javascript utilise UTF-8 pour ses chaînes

Non, non.

Chaque page a son enconding charset défini dans la balise meta, juste au-dessous élément de tête

<head>
<meta http-equiv="content-type" content="text/html; charset=UTF-8"/>

ou

<head>
<meta http-equiv="content-type" content="text/html; charset=ISO-8859-1"/>

En outre, chaque page devrait être modifié avec le charset cible encodage . Dans le cas contraire, il ne fonctionnera pas comme prévu.

Et il est une bonne idée de définir son codage charset cible côté serveur.

Java
<%@page pageEncoding="UTF-8" contentType="text/html; charset=UTF-8"%>

PHP
header("Content-Type: text/html; charset=UTF-8");

C#
I do not know how to...

Et il pourrait être une bonne idée de mettre en place chaque fichier de script si elle utilise des caractères sensibles (á, é, í, ó, ú et ainsi de suite ...).

<script type="text/javascript" charset="UTF-8" src="/PATH/TO/FILE.js"></script>

...

  

Il est donc ma théorie que si je transcoder la chaîne ISO-8859-1 avant de l'envoyer, il faut résoudre mon problème

Non, non.

Le serveur cible peut gérer les chaînes dans d'autres que ISO-8859-1 . Par exemple, gère Tomcat dans la norme ISO-8859-1, peu importe la façon dont vous configurez votre page. Ainsi, sur le côté serveur, vous pourriez avoir à configurer votre demande selon la façon dont votre configurer votre page.

Java
request.setCharacterEncoding("UTF-8")

PHP
// I do not know how to...

Si vous voulez vraiment traduire le charset cible codant, ESSAYEZ comme suit

InternetExplorer
    formElement.encoding = "application/x-www-form-urlencoded; charset=ISO-8859-1";
ELSE
    formElement.enctype  = "application/x-www-form-urlencoded; charset=ISO-8859-1";

ou , vous devez fournir une fonction qui obtient la représentation numérique, en Unicode Jeu de caractères utilisé par chaque personnage. Il fonctionnera indépendamment du codage charset cible. Par exemple, á Unicode du jeu de caractères \ u00E1;

alert("á without its Unicode Character Set numerical representation");
function convertToUnicodeCharacterSet(value) {
    if(value == "á")
        return "\u00E1";
}
alert("á Numerical representation in Unicode Character Set is: " + convertToUnicodeCharacterSet("á"));

vous pouvez voir en action:

Vous pouvez utiliser cette lien comme ligne directrice (Voir échappe JavaScript)

Ajouté à réponse originale comment je mets en œuvre jQuery fonctionalité

var dataArray = $(formElement).serializeArray();
var queryString = "";
for(var i = 0; i < dataArray.length; i++) {
    queryString += "&" + dataArray[i]["name"] + "+" + encodeURIComponent(dataArray[i]["value"]);
}
$.ajax({
    url:"url.htm",
    data:dataString,
    contentType:"application/x-www-form-urlencoded; charset=UTF-8",
    success:function(response) {
        // proccess response
    });
});

Il fonctionne très bien sans aucun mal de tête.

Cordialement,

Autres conseils

J'ai eu un problème très similaire. Je avais besoin de passer un paramètre d'URL en utilisant JQuery pour faire un appel ajax, et la plupart des valeurs fois des paramètres inclus accents.

Les deux pages devaient être mis à charset = ISO-fonctions de 8859-1 et javascript: encodeURI, etc. encodeURIComponent utilise uniquement UTF-8

.

Ce que je faisais était de créer un lien dans la page d'origine, y compris tous les paramètres sans codage, disons:

var myLink = document.getElementById("myHiddenLink");
myLink.setAttribute("href", "México, Perú, María and any other words with accents and spaces");

et puis attribuez-lui la valeur href à une variable, comme ceci:

var theLink = myLink.getAttribute("href");

valeur de la variable Donc finalement "thelink" était ISO-8859-1 codé, et tout fonctionnait très bien.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top