Como transcodifico uma string Javascript para ISO-8859-1?
-
21-09-2019 - |
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"
});
}
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.