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 escape
y unescape
utilizadas para codificar y decodificar cadenas de consulta se definen para caracteres ISO, mientras que las más recientes encodeURIComponent
y decodeURIComponent
que hacen lo mismo, se definen para caracteres UTF8.
escape
codifica caracteres extendidos ISO-8859-1 (puntos de código UTF U + 0080-U + 00ff) como %xx
(hexadecimal de dos dígitos), mientras que codifica puntos de código UTF U + 0100 y por encima de como %uxxxx
(%u
seguido de cuatro -digit hex.) Por ejemplo, escape("å") == "%E5"
y escape("あ") == "%u3042"
.
encodeURIComponent
porcentaje-codifica los caracteres extendidos como una secuencia de bytes UTF8. Por ejemplo, encodeURIComponent("å") == "%C3%A5"
y encodeURIComponent("あ") == "%E3%81%82"
.
lo que puede hacer:
fixedstring = decodeURIComponent(escape(utfstring));
Por ejemplo, un carácter "A" incorrectamente codificado convierte en "¥". El comando hace escape("Ã¥") == "%C3%A5"
que son los dos caracteres ISO incorrectos codificados como bytes individuales. Luego decodeURIComponent("%C3%A5") == "å"
, donde los dos bytes codificados por ciento se interpretan como una secuencia UTF8.
Si había necesidad de hacer a la inversa, por alguna razón, que funciona también:
utfstring = unescape(encodeURIComponent(originalstring));
¿Hay una manera de diferenciar entre cadenas UTF8 y malas 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;
}
He hecho referencia a tu respuesta sobre la respuesta por mi cuenta pregunta aquí: http://stackoverflow.com/questions/18847191/is-there-a-uniform-method-in-both-php-and-js-to-convert-unicode-characters/18863966#18863966 – hsuk
@nitro : ¿Javascript considera todos los caracteres utf-8 como ISO latino? – hsuk
'escape' codifica caracteres extendidos ISO-8859-1 (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ígitos hex.) Por ejemplo,' escape ("å") == "% E5" 'y' escape ("あ") == "% u3042" '. El porcentaje de codificación 'encodeURIComponent' codifica los caracteres extendidos como una secuencia de bytes UTF8. Por ejemplo, 'encodeURIComponent (" å ") =="% C3% A5 "' y 'encodeURIComponent (" あ ") =="% E3% 81% 82 "'. Espero que aclare cualquier pregunta. – nitro2k01