utf8_encode convertir acentos javascript jquery character-encoding

javascript - convertir - utf8_encode



¿Cómo convierto caracteres UTF-8 especiales a su equivalente iso-8859-1 usando javascript? (6)

Estoy creando una aplicación de JavaScript que recupera archivos .json con jquery e inyecta datos en la página web en la que está incrustado.

Los archivos .json están codificados con UTF-8 y contienen caracteres acentuados como é, ö y å.

El problema es que no controlo el juego de caracteres en las páginas que van a usar la aplicación.

Algunos usarán UTF-8, pero otros usarán el juego de caracteres iso-8859-1. Esto, por supuesto, distorsionará los caracteres especiales de los archivos .json.

¿Cómo convierto caracteres UTF-8 especiales a su equivalente iso-8859-1 usando javascript?


Dado que la question sobre cómo convertir de ISO-8859-1 a UTF-8 está cerrada debido a esto, voy a publicar mi solución aquí.

El problema es cuando tratas de OBTENER algo utilizando XMLHttpRequest, si el XMLHttpRequest.responseType es "texto" o está vacío, el XMLHttpRequest.response se transforma en un DOMString y eso es cuando las cosas se rompen. Después, es casi imposible trabajar de manera confiable con esa cadena.

Ahora, si el contenido del servidor es ISO-8859-1, tendrá que forzar la respuesta para que sea de tipo " Blob " y luego convertir esto a DOMSTring. Por ejemplo:

var ajax = new XMLHttpRequest(); ajax.open(''GET'', url, true); ajax.responseType = ''blob''; ajax.onreadystatechange = function(){ ... if(ajax.responseType === ''blob''){ // Convert the blob to a string var reader = new window.FileReader(); reader.addEventListener(''loadend'', function() { // For ISO-8859-1 there''s no further conversion required Promise.resolve(reader.result); }); reader.readAsBinaryString(ajax.response); } }

Parece que la magia está sucediendo en readAsBinaryString, así que tal vez alguien pueda arrojar algo de luz sobre por qué esto funciona.


El problema es que una vez que la página se sirve, el contenido estará en la codificación descrita en la metaetiqueta de tipo de contenido. El contenido en codificación "incorrecta" ya está distorsionado.

Lo mejor es hacer esto en el servidor antes de publicar la página. O como he dicho, decir: UTF-8 de extremo a extremo o morir .


Estaba buscando esta respuesta, pero creo en una línea contra muchos códigos, podría ser algo como esto:

var converted = "<?php echo mb_convert_encoding($str_to_convert, ''UTF-8'', ''ISO-8859-1''); ?>";

Eso funcionó para mí, pero si pones la var en php, así:

document.write("<?php $str_to_convert = " + your_str + " ?>");

Espero que esto también ayude a cualquiera.


Internamente, las cadenas de Javascript son todas Unicode (en realidad UCS-2, un subconjunto de UTF-16).

Si está recuperando los archivos JSON por separado a través de AJAX, solo necesita asegurarse de que los archivos JSON se publiquen con el tipo de contenido y el juego de caracteres correctos: Content-Type: application/json; charset="utf-8" Content-Type: application/json; charset="utf-8" ). Si haces eso, jQuery ya debería haberlos interpretado correctamente para cuando accedes a los objetos deserializados.

¿Podría publicar un ejemplo del código que está utilizando para recuperar los objetos JSON?


debes agregar esta línea encima de tu página

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


En realidad, todo se almacena típicamente como unicode de algún tipo internamente, pero no vamos a entrar en eso. Supongo que obtendrás las emblemáticas cadenas de caracteres "à ¥ äÃ" "porque estás usando un ISO-8859 como codificación de tu personaje. Hay un truco que puedes hacer para convertir esos personajes. Las funciones de unescape y unescape utilizadas para codificar y decodificar cadenas de consulta se definen para caracteres ISO, mientras que los nuevos encodeURIComponent y decodeURIComponent que hacen lo mismo, se definen para los caracteres UTF8.

escape codifica caracteres ISO-8859-1 extendidos (puntos de código UTF U + 0080-U + 00ff) como %xx (hex de dos dígitos) mientras que codifica los puntos de codificación UTF U + 0100 y superiores como %uxxxx ( %u seguido de cuatro- dígito hexadecimal). Por ejemplo, escape("å") == "%E5" y escape("あ") == "%u3042" .

encodeURIComponent porcentaje-codifica caracteres extendidos como una secuencia de bytes UTF8. Por ejemplo, encodeURIComponent("å") == "%C3%A5" y encodeURIComponent("あ") == "%E3%81%82" .

Entonces puedes hacer:

fixedstring = decodeURIComponent(escape(utfstring));

Por ejemplo, un carácter codificado incorrectamente "å" se convierte en "Ã ¥". El comando no escape("Ã¥") == "%C3%A5" que son los dos caracteres ISO incorrectos codificados como bytes individuales. Luego decodeURIComponent("%C3%A5") == "å" , donde los bytes codificados en dos por ciento se interpretan como una secuencia UTF8.

Si necesita hacer lo contrario por alguna razón, eso también funciona:

utfstring = unescape(encodeURIComponent(originalstring));

¿Hay alguna forma de diferenciar entre cadenas UTF8 incorrectas y cadenas ISO? Resulta que hay. La función decodeURIComponent utilizada anteriormente lanzará un error si se le da una secuencia codificada mal formada. Podemos usar esto para detectar con gran probabilidad si nuestra cadena es UTF8 o ISO.

var fixedstring; try{ // If the string is UTF-8, this will work and not throw an error. fixedstring=decodeURIComponent(escape(badstring)); }catch(e){ // If it isn''t, an error will be thrown, and we can asume that we have an ISO string. fixedstring=badstring; }