Pergunta

Estou escrevendo uma extensão do Chrome que funciona com um site que usa ISO-8859-1.Apenas para contextualizar, o que minha extensão faz é agilizar a postagem nos fóruns do site, adicionando um formulário de postagem mais conveniente.O valor da textarea onde a mensagem é escrita é então enviado através de uma chamada Ajax (usando jQuery).

Se a mensagem contiver caracteres como á esses caracteres aparecem como á na mensagem postada.Forçar o navegador a exibir UTF-8 em vez de ISO-8859-1 faz com que o á aparecem corretamente.

Entendo que Javascript usa UTF-8 para suas strings, então é minha teoria que se eu transcodificar a string para ISO-8859-1 antes de enviá-la, isso deverá resolver meu problema.No entanto, parece não haver uma maneira direta de fazer essa transcodificação em Javascript e não consigo alterar o código do lado do servidor.Algum conselho?

Tentei configurar o formulário criado para usar iso-8859-1 assim:

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

E também:

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

Mas isso não parece funcionar.

EDITAR:

O problema, na verdade, estava em como o jQuery estava codificando a mensagem em url (ou algo ao longo do caminho). Corrigi isso dizendo ao jQuery para não processar os dados e fazendo isso sozinho, como é mostrado no trecho a seguir:

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"
  });
}
Foi útil?

Solução

Entendo que o JavaScript usa UTF-8 para suas strings

Não não.

Cada página tem seu charset que está preenchendo em meta tag, logo abaixo elemento da cabeça

<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"/>

Além disso, cada página deve ser editado com a codificação do charset alvo. Caso contrário, não funcionará conforme o esperado.

E é uma boa ideia definir sua codificação de charset de destino no lado do servidor.

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...

E pode ser uma boa idéia configurar cada arquivo de script, se ele usa caracteres sensíveis (á, é, Í, Ó, Ú e assim por diante ...).

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

...

Portanto, é minha teoria de que, se eu transcodificar a string para ISO-8859-1 antes de enviá-la, ela deve resolver meu problema

Não não.

O servidor de destino poderia lidar com strings em outros que não a ISO-8859-1. Por exemplo, o Tomcat lida no ISO-8859-1, não importa como você configure sua página. Portanto, no lado do servidor, você pode precisar configurar sua solicitação de acordo com a forma como você configura sua página.

Java
request.setCharacterEncoding("UTF-8")

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

Se você realmente deseja traduzir a codificação do charset de destino, tente o seguinte

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 Você deve fornecer uma função que obtenha a representação numérica, no conjunto de caracteres Unicode, usado por cada caractere. Funcionará independentemente da codificação do charset alvo. Por exemplo, á como o conjunto de caracteres Unicode é 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("á"));

Aqui Você pode ver em ação:

Você pode usar isso link como diretriz (veja JavaScript escapes)

Adicionado à resposta original como eu implemento funcionalidade 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
    });
});

Funciona bem sem dor de cabeça.

Cumprimentos,

Outras dicas

Eu tive um problema muito semelhante.Eu precisava passar um parâmetro de URL usando JQuery para fazer uma chamada ajax, e na maioria das vezes os valores dos parâmetros incluíam acentos.

Ambas as páginas tiveram que ser configuradas para charset=ISO-8859-1 e funções do javascript:encodeURI, encodeURIComponent etc.usa apenas UTF-8.

O que fiz foi criar um link na página original, incluindo todos os parâmetros sem nenhuma codificação, digamos:

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

e então atribua o valor href a uma variável, assim:

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

Então, finalmente, o valor da variável "theLink" foi codificado em ISO-8859-1 e tudo funcionou perfeitamente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top