¿Dónde puedo encontrar una tabla de bits de UTF8 a char a convertir, por ejemplo, “Ã ±” en la “ñ”?

StackOverflow https://stackoverflow.com/questions/3920432

Pregunta

He estado buscando a fondo a través de la web y me parece que no puede encontrar una tabla con ese tipo de conversiones. Los que más me encontrar algunos errores y no son demasiado fiables, por lo que he buscado alguna mesa oficial o igual, pero por desgracia no tienen .. así que aquí estoy ..

Como se menciona en el título, lo que quiero hacer es, por ejemplo, sabe lo que hace "Ã ±" representan (éste ya sé .. "ñ"), pero no sólo para los personajes españoles, pero otros ( ya sé las polacas).

El problema principal es que tengo una cadena en PHP que a veces puede venir como por ejemplo "eñe" (que está bien) y otros como "EA ± e" .. y en la lattest yo debería ser capaz de cambiar a " eñe" por lo que se puede leer .. pero si está bien no quiero cambiarlo. Con el fin de hacer esto, yo estaba usando la función utf8_decode, pero en caso de que la cadena se puede leer, que todavía va a cambiar la "ñ" a "n" (pero blanco) .. Por eso es que no siempre se puede decodificar la cadena, y si uso la función mb_detect_encoding, siempre voy a conseguir "UTF-8" como respuesta .. y no es tan útil ..

Una vez que sé todos los caracteres UTF-8 bits escritos como por ejemplo "Ã ±" para "ñ", "ä¹" para "Z", etc., me he propuesto hacer una función que básicamente reemplazar uno a otro. . que es una especie de la misma cosa que la hace utf8_decode .. a menos que alguien de aquí tiene una mejor solución!

Gracias de antemano! Saludos!

¿Fue útil?

Solución

¿Por qué quieres hacer esto? ¿Quieres recuperar datos dañados o algo así?

Debe realmente no puede hacer como parte del flujo de código de negocio habitual. Todo lo que necesita hacer es asegurarse de que todas las capas de la aplicación web está utilizando UTF-8 correctamente. La fuente PHP, la cabecera de respuesta HTTP y el cuerpo, la tabla de DB, la conexión DB, etcétera. Ver también PHP UTF-8 cheatsheet .

Si realmente quiere hacer esto como una tarea de una sola vez para recuperar datos dañados, entonces es bueno saber que los datos dañados en su pregunta indica datos UTF-8, que incorrectamente se ha almacenado o muestra como ISO-8859-1. Sólo tiene que leer los datos como ISO-8859-1 y escritura como UTF-8. Una vez. A continuación, hacerlo de la manera correcta.

Como prueba, la ñ ( de caracteres Unicode 'Letra latina minúscula N con tilde'(U + 00F1) ) existe en Unicode ( UTF-8 , una codificación multi-byte) de bytes 0xC3 y 0xB1. Cuando esos bytes se codifican utilizando una codificación de un solo byte como ISO-8859-1, entonces el 0xC3 convierte à y la 0xB1 convierte ±. Véase también el página de códigos ISO-8859-1 diseño .

Otros consejos

El problema es que una vez que tenga mojibake , no hay es manera confiable para convertir de nuevo a lo que se supone que significa eso. Ver este párrafo en Wikipedia para una explicación del problema:

  

Considere un archivo de texto que contiene la palabra alemana für en la codificación ISO-8859-1. Este archivo ahora se abre con un editor de texto que supone la entrada es UTF-8. Como el primer byte (0x66) está dentro del rango 0x00-0x7F, UTF-8 interpreta correctamente como un f. El segundo byte (0xFC) no es un valor válido para el inicio de cualquier carácter codificado en UTF-8. Por tanto, un editor de texto podría reemplazar el byte con el símbolo de carácter de sustitución para advertir al usuario de que algo salió mal. El último byte (0x72) también está dentro del rango de códigos 0x00-0x7F y puede ser decodificada correctamente. Toda la cadena se muestra ahora como esta:. f�r

     

Un editor de texto implementado mal podría salvar la sustitución en UTF-8 forman; los datos del archivo de texto será el siguiente aspecto: 0x66 0xEF 0xBF 0xBD 0x72, que se mostrará en la norma ISO-8859-1 de nuevo como f�r. La sustitución también destruye el byte original, por lo que es imposible de recuperar lo que se pretendía carácter.

Es necesario evitar de forma incorrecta interpretación de texto utilizando la codificación mal desde el principio. Fijándola cuando se ha roto es demasiado tarde.

Su problema es un problema de interpretación más de la transcodificación. En cualquier equipo moderno, n es normalmente de entrada como 0xc3b1 binario, ya que es su código UTF-8. Si se interpreta que (sin transcodificación) en el viejo código iso-latino-15, obtendrá 0xC3 = A seguido de 0xB1 = ±. Es por esto que no hay una "mesa":. Se trata de un problema de visualización

Lo mejor que puede hacer es evitar iso-latino por completo. Se le causar un montón de problemas. La verdadera manera de arreglar su programa es:. Uso exclusivo UTF-8 en todas partes, que le ahorrará mucho tiempo y dolores de cabeza

Mientras tanto, si usted realmente desea para ir a buscar el 15-iso-latino cadena equivalente a la entrada de UTF-8 (que no lo hace, si usted tiene la derecha arriba), puede pasar su cadena a cualquier código convertidor, pidiendo para convertir UTF-8 a ISO-LATIN-15 . Una cosa que debe tener cuidado es de doble transcodificación. Si usted tenía una cadena UTF-8 y mistakingly pedirá una conversión de iso-lating-15 y UTF-8, entonces usted tiene una cadena UTF-8 que dice en realidad à ±, que es 0xc383c2b1 binario. Para conseguir de nuevo la cadena correcta UTF-8, el anwser es el mismo: pedir a convertir la cadena de mutilado de UTF-8 a ISO-LATIN-15, que estará feliz de tomar 0xc383 y convertirlo en 0xC3, entonces 0xc2b1 y convertirlo en 0xB1, dándole una cadena UTF-8 que contiene una correcta ñ correcta.

Especialmente para aplicaciones web PHP y, recuerde que muchos ordenadores (y cada vez más en el futuro) le enviará UTF-8 por omisión.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top