18

Estoy escribiendo una extensión de Chrome que funciona con un sitio web que usa ISO-8859-1. Solo para dar un contexto, lo que hace mi extensión es hacer que la publicación en los foros del sitio sea más rápida al agregar un formulario de publicación más conveniente. El valor del área de texto donde se escribe el mensaje se envía a través de una llamada Ajax (usando jQuery).¿Cómo puedo transcodificar una cadena de Javascript a ISO-8859-1?

Si el mensaje contiene caracteres como á, estos caracteres aparecen como á en el mensaje publicado. Obligar al navegador a mostrar UTF-8 en lugar de ISO-8859-1 hace que el á aparezca correctamente.

Tengo entendido que Javascript usa UTF-8 para sus cadenas, por lo que mi teoría es que si transduzco la cadena a ISO-8859-1 antes de enviarla, debería resolver mi problema. Sin embargo, parece que no hay una forma directa de hacer esta transcodificación en Javascript, y no puedo tocar el código del lado del servidor. ¿Algún consejo?

He tratado de establecer la forma creada para usar iso-8859-1 así:

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

Y también:

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

Pero eso no parece funcionar.

EDIT:

El problema en realidad mintió en la forma en jQuery se URLEncoding el mensaje (o algo por el camino), me fijo esto diciéndole jQuery no para procesar los datos y hacerlo yo mismo, como se muestra en la siguiente fragmento:

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" 
    }); 
} 
+0

¿Cómo está enviando el mensaje (por ejemplo, un ejemplo completo de un error en el código AJAX)? –

Respuesta

23

es mi entendimiento de que Javascript utiliza UTF-8 para sus cadenas

no, no.

Cada página ha definido su Enconding charset en etiqueta meta, justo debajo de elemento de cabeza

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

o

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

Además de eso, cada página debe ser editado con la codificación charset objetivo. De lo contrario, no funcionará como se esperaba.

Y es una buena idea definir su codificación de juego de caracteres objetivo en el lado del 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... 

Y podría ser una buena idea para configurar cada archivo de comandos si se utiliza caracteres sensibles (a, e, i, o, u, y así sucesivamente ...).

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

...

Por lo tanto, es mi teoría de que si transcodificar la cadena a la norma ISO-8859-1 antes de enviarlo, debe resolver mi problema

No, no.

El servidor de destino podría manejar cadenas que no sean ISO-8859-1. Por ejemplo, Tomcat maneja en ISO-8859-1, sin importar cómo configure su página. Por lo tanto, en el lado del servidor, podría tener que configurar su solicitud de acuerdo con la configuración de su página.

Java 
request.setCharacterEncoding("UTF-8") 

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

Si realmente desea traducir la codificación charset de destino, TRY de la siguiente manera

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

O usted debe proporcionar una función que obtiene la representación numérica, en el grupo de caracteres Unicode, utilizado por cada uno personaje. Funcionará independientemente de la codificación del juego de caracteres objetivo. Por ejemplo, á como Unicode Character Set es \ 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("á")); 

Here se puede ver en acción:

Se puede usar esta link como directriz (Ver JavaScript escapa)

Añadido a respuesta original cómo implemento jQuery funcionalidad

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 bien sin ningún dolor de cabeza.

Saludos,

+0

Gracias por la respuesta informativa, lo estoy marcando como correcto, aunque esta no fue exactamente la solución. Mi publicación realmente no dio suficiente información para mostrar el verdadero problema. (Solo me enteré de eso después de golpearme la cabeza contra la pared por unas horas más) –

+0

@ Marcos Marin Contenido adicional a la respuesta original –

+0

Para C#: <% @ Page RequestEncoding = "utf-8" ResponseEncoding = "utf -8 "%> –

4

Tuve un problema muy similar. Necesitaba pasar un parámetro de URL usando JQuery para hacer una llamada ajax, y la mayoría de las veces los valores de los parámetros incluían acentos.

Ambas páginas deben configurarse en charset = ISO-8859-1 y las funciones de javascript: encodeURI, encodeURIComponent, etc. solo usa UTF-8.

Lo que hice fue crear un enlace en la página original, incluyendo todos los parámetros sin ningún tipo de codificación, digamos:

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

y luego asignar el valor href a una variable, como esto:

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

Así que finalmente el valor de la variable "theLink" fue codificado con ISO-8859-1, y todo funcionó bien.

Cuestiones relacionadas