web-dev-qa-db-fra.com

Comment transcoder une chaîne Javascript en ISO-8859-1?

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

Si le message contient des caractères comme á ces caractères apparaissent comme á dans le message publié. Forcer le navigateur à afficher UTF-8 au lieu de ISO-8859-1 rend le á s'affiche correctement.

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

J'ai essayé de configurer le formulaire créé pour utiliser l'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.

ÉDITER:

Le problème résidait en fait dans la façon dont jQuery encodait le message (ou quelque chose en cours de route), j'ai corrigé cela en disant à jQuery de ne pas traiter les données et de le faire moi-même comme le montre l'extrait de code 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"
  });
}
19
Marcos Marin

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

Non non.

Chaque page a son ensemble de caractères défini dans la balise meta, juste en dessous de l'élément head

<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 plus de cela, chaque page doit être modifiée avec l'encodage du jeu de caractères cible . Sinon, cela ne fonctionnera pas comme prévu.

Et c'est une bonne idée de définir son codage de jeu de caractères 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 ce pourrait être une bonne idée de configurer chaque fichier de script s'il utilise des caractères sensibles (á, é, í, ó, ú et ainsi de suite ...).

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

...

C'est donc ma théorie que si je transcode la chaîne en ISO-8859-1 avant de l'envoyer, cela devrait résoudre mon problème

Non non.

Le serveur cible peut gérer des chaînes autres que ISO-8859-1 . Par exemple, Tomcat gère l'ISO-8859-1, quelle que soit la configuration de votre page. Donc, côté serveur, vous pourriez avoir à configurer votre demande en fonction de la configuration de votre page.

Java
request.setCharacterEncoding("UTF-8")

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

Si vous voulez vraiment traduire l'encodage du jeu de caractères cible, 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, dans le jeu de caractères Unicode, utilisée par chaque caractère. Cela fonctionnera quel que soit l'encodage du jeu de caractères cible. Par exemple, á comme jeu de caractères Unicode est\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("á"));

Ici vous pouvez voir en action:

Vous pouvez utiliser ceci lien comme guide (voir les échappements JavaScript)

Ajouté à la réponse originale comment j'implémente la fonctionnalité jQuery

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
    });
});

Cela fonctionne bien sans aucun mal de tête.

Cordialement,

24
Arthur Ronald

J'ai eu un problème très similaire. Je devais passer un paramètre d'URL à l'aide de JQuery pour effectuer un appel ajax, et la plupart du temps, les valeurs des paramètres incluaient des accents.

Les deux pages devaient être définies sur charset = ISO-8859-1 et les fonctions de javascript: encodeURI, encodeURIComponent etc. utilise uniquement UTF-8.

Ce que j'ai fait était de créer un lien dans la page d'origine, incluant tous les paramètres sans aucun encodage, disons:

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

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

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

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

4
Sergio