2

Tengo una base de datos en formato .csv que he exportado a mi base de datos MySQL y cuyos registros quiero visualizar en una web mediante PHP.

El problema, es que algunos de los caracteres se encuentran codificados en el fichero .csv, por ejemplo \xe9 que corresponde al carácter unicode é.

La palabra Atlético me la muestra como Atl\xe9tico

El campo que almacena el texto en la base de datos, lo he declarado como VARCHAR con cotejamiento utf8_spanish_ci

¿Cómo podría solucionarlo?

Pedro
  • 281
  • 1
  • 4
  • 14
  • 4
    Posible duplicado de [¿Por que el Carácter inspector (�) aparece en algunos datos obtenidos de la Base de Datos?](https://es.stackoverflow.com/questions/59489/por-que-el-car%c3%a1cter-inspector-aparece-en-algunos-datos-obtenidos-de-la-base) . El problema es tratado con amplitud en la respuesta aceptada. – A. Cedano Dec 29 '17 at 16:58

1 Answers1

2

Hay que tener muchas cosas en cuenta:

1) Lo primero que debes hacer es abrir el archivo .csv luego click en archivo-> guardar como y cuando te sale la pantalla de la ubicación en donde guardarás el archivo en la parte de abajo encontrarás una pestaña que dice "codificación" normalmente esta por defecto en "ANSI" debes cambiarla a "utf-8" luego lo guardas nuevamente con extensión .csv

2) Revisa que en la sección de tus formularios web este el meta tag siguiente:

 <head>
  <meta charset="UTF-8">
</head>

3) Debido a que ya revisastes el cotejamiento de tu base de datos sólo queda que luego del string de conexión que tienes en tus archivos php coloques despues de seleccionar la base de datos en mysql (mysql_select_db):

mysql_query("SET NAMES 'utf8'");

Para tener doble garantía que todo queda en utf-8 en la base de datos

Observación: He colocado mysql como instrucción porque desconozco si posees php7 de ser así debes cambiar donde dice mysql por mysqli debido a que las instrucciones mysql estan obsoletas desde la versión de PHP 5.5.0 y eliminadas desde la versión PHP 7.0.0. Para ver mas de esto click Aquí

4) Recuerda también guardar en codificación utf-8 todos los archvivos de tu proyecto .php ya que muchos de los editores de texto vienen por defecto en codificación ANSI (como lo que expliqué en el paso 1)

5) Si tienes un archivo .htaccess en la carpeta raíz de tu proyecto, abre el archivo y coloca como primera linea:

AddDefaultCharset utf-8

6) Si nada de lo anterior ha funcionado solo quedaría que despues de ejecutar la query en mysql justo antes de mostrar la información (imprimirla con echo) colocar primero:

$mostrar = utf8_decode($mostrar);

donde $mostrar es cualquier campo obtenido de la tabla a la que hiciste select. Lo coloco de último porque debe hacerse cada vez que muestres información al usuario proveniente de la tabla que te esta dando esos caracteres \xe9.

Puedes revisar el utf8_decode aquí.

Esto es todo. Ya deberías tener solucionado el problema. Un saludo!

Art_Code
  • 2,415
  • 2
  • 8
  • 23
  • He probado lo que me has dicho, pero no me funciona. En Python tengo una función que funciona: decode("unicode_escape"); ¿Hay algún equivalente en PHP? – Pedro Dec 29 '17 at 12:17
  • También he probado a primero transformar la Base de Datos con el comando decode("unicode_escape"); Al cargar los caracteres especiales en la Base de Datos MySQL ( emoticons, etc. , me dá error, pero lo carga. No obstante, luego no lo imprime correctamente en la web. – Pedro Dec 29 '17 at 12:21
  • Si existe en php: utf8_decode(). Actualizare mi respuesta para incluirlo – Art_Code Dec 29 '17 at 13:40
  • Usar `utf8_decode` será una solución *a medio camino*. En estos casos es preciso ir a la raíz del problema, para no tener que pasarse la vida codificando y decodificando. El uso de funciones intermedias, aparte de que repercute en el rendimiento, te obliga a usar siempre dicha función cuando necesites presentar tus datos... si un día olvidas usarla, tendrás el mismo problema, porque en el fondo tus datos no están codificados como deberían estarlo. Si puedes resolver el problema de raíz, **resuélvelo de una vez por todas.** – A. Cedano Dec 29 '17 at 17:02
  • @A.Cedano Concuerdo perfectamente contigo. Es cierto que disminuye el rendimiento pero en vista de que Pedro comentó en mi respuesta y pidió una instrucción como esa pues la incluí. Sin embargo es extraño que con esas 5 alternativas que le dí no pudiera resolver, ya que son las que simplifican el trabajo y no afectan el rendimiento. – Art_Code Dec 29 '17 at 17:07
  • Finalmente lo he solucionado utilizando el meta tag `` que indicas y, además, seguidamente después de hacer la conexión con la base de datos he añadido esta función `mysql_set_charset("UTF8", $dbh);`. Además, he cambiado la codificación de la base de datos a **utf8mb4** para que admita los Emoji de twitter, ya que algunos requieren hasta 4 bytes. – Pedro Jan 04 '18 at 12:43