Error con acentos y eÑes en PHP/MySQL (Solucionado)

23 May 2009

Muchas veces al crear una web con PHP y MySQL, ocurre un problema al introducir y mostrar datos: estos se alteran acabando en áóñ y cosas parecidas. Cuando me pasa esto suelo empezar a toquetear cosas, cambiar charsets y traducir a ñ o á pero nada funciona. El problema es que la configuración del cotejamiento de los caracteres especiales como acentos, eñes y demás símbolos no es el mismo entre la base de datos (MySQL), el lenguaje de servidor (PHP) y el servidor (Apache).

Así que me puse a buscar y después de encontrar comentarios buenísimos de gente por los foros puedo hacer un resumen de todo lo necesario cuando nos ocurre un problema de estos (id haciendo y testeando si ya funciona todo bien paso a paso).

Guía paso a paso para solucionar el problema de los acentos y eñes

  1. Al crear la base de datos MySQL, asegúrate que los campos string y demás esten en utf8_spanish_ci y el cotejamiento de las tablas en
    utf_unicode_ci (más tarde en Operations > Collation de phpMyAdmin se puede cambiar)
  2. Pon en el <head> de todos los archivos HTML:
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  3. Y en los puramente PHP (que muestran XML, llamadas de AJAX, APIs…) pon el código:
    header("Content-Type: text/html;charset=utf-8");
  4. Al crear la conexión de PHP con MySQL, envía esta consulta justo tras la conexión:
    mysql_query("SET NAMES 'utf8'");
    (Para MySQLi escribe $acentos = $db->query("SET NAMES 'utf8'"); gracias Fernando)
  5. Quita el DefaultCharset del Apache o modifícalo
  6. Como última y desesperada opción, quita todos los htmlentities();

Haciendo estos pasos se solucionará cualquier problema de codificación de caracteres. Si aún así no se arregla postead un comentario aquí abajo o investigad en las referencias:

Fotografia por Eduardo

by Xavi

Share it with the world!

Comments

56 comments to Error con acentos y eÑes en PHP/MySQL (Solucionado)

  • Avatar chrono

    Hermano muchas gracias!!

    El paso 4 fue el que me sirvió.

    Excelente, felicidades por este miniresumen!

    June 2nd, 2009 at 6:07 am
  • Avatar Miguel

    Muchas gracias funciono perfecto, he intentado muchas formas y esta es la única que simplemente me salvó.

    Un saludo y gracias de nuevo.

    June 12th, 2009 at 8:49 pm
  • Avatar Nico

    Muchisimas gracias, me sirvio muchisimo!

    June 21st, 2009 at 5:33 am
  • Avatar skeksi

    Eres un makina tronko :P… ¡yo de mayor quiero ser luckyshot!

    ciao pescao

    June 22nd, 2009 at 12:05 am
  • Avatar elsaforenc

    Tio, tenía ese mismo problema y he estado unas cuantas horas buscando en internet. Muchos comentarios al respecto pero pocas soluciones, hasta que San Google me ha llevado aquí. No suelo dejar comentarios, pero esto lo merece: Muchas gracias!!

    July 12th, 2009 at 1:26 am
  • Avatar walter

    Excelente, muy buena ayuda a la comunidad de desarrolladores…

    Muchas Gracias.

    July 23rd, 2009 at 12:16 am
  • Avatar yoa

    Sii, de verdad muy buena ayuda, yo también estuve buscando una solución para mi problema durante horas y pos ya la encontré.

    Muchas gracias!!!

    August 12th, 2009 at 5:51 pm
  • Avatar Gerber

    Hola! Por casualidad del destino encontré este blog! y plop! el paso 4 me fue de maravilla! muchas gracias!

    August 13th, 2009 at 5:52 am
  • Avatar Raúl

    Estoy comenzando a construir la página y tu ayuda fue muy importante.
    Muchas gracias.

    September 1st, 2009 at 6:28 pm
  • Avatar David

    El paso 4, siempre se me olvida, gracias por hacerme memoria.

    September 6th, 2009 at 10:02 pm
  • Avatar Ayo

    No conocia el paso 4 y ha funcionado! Muchas gracias

    September 15th, 2009 at 6:38 pm
  • Avatar Ray

    Excelente, llevo tiempo buscando una solución, y las que encontraba eran muy confusas y habia que cambiar muchas cosas, y con solo insertar el paso 4 resultó. Un millón de gracias.

    September 17th, 2009 at 5:40 am
  • Avatar peloon

    me encantaria saber a que te refieres con el punto 5…

    Quitar todos los htmlentities….

    te refieres a eliminar las funciones de nuestros codigos PHP o a aplicar esta función ???

    September 18th, 2009 at 10:54 pm
  • Avatar Xavi

    Hola peloon,

    Me refiero a que si usas el htmlentities() para intentar solucionar el problema, ya no hará falta si sigues los demás puntos. Así que quítalos y cuentas si te funcionó.

    Saludos

    September 18th, 2009 at 11:09 pm
  • Avatar Mauricio

    BAH!, y si usas netbeans en linux usando todo en orden con utf-8 y lo pasas a windows y pones un javascript con una expresion regular que lleva eñes obligatoriamente, estas en un infierno…

    October 15th, 2009 at 10:28 pm
  • Avatar Hernan

    Muchiiisimas gracias.
    Muy buen aporte y muy bien explicado. !!!!!!

    November 19th, 2009 at 6:51 pm
  • Avatar WeSkEr

    Vaya que muy buena ayuda la que me has dado amigo, ya esta por pensar que tendría que hacer todo de nuevo xD muchisimas gracias por la nota que me vino de perlas, saludos :D

    December 5th, 2009 at 11:36 pm
  • Avatar Heimdal

    Muchas gracias, voy a linkear a este blog :D Gracias

    January 17th, 2010 at 1:39 am
  • Avatar Enrique

    Me has salvado la vida! 4 horas buscando la solución.

    February 5th, 2010 at 9:18 pm
  • Avatar Marcos huerta hrenandez

    perfecto y mas que eso excelente al final me estaba dando porvencido pero analizandolo bien me di cuenta que hay que realizar los 6 pasos ya que el comportamiento es diferente en distintos Servidores y esto me llevo a entender que es una solucion general para la mayoria de rosoluciones del lado del servidor, navegador y cliente web.. gracias…

    February 8th, 2010 at 5:58 pm
  • Avatar juan

    Muchas gracias por esta solución. Estuve varias horas probando con muchas alternativas que aparecen en la web y nada me resultaba.
    Saludos

    February 8th, 2010 at 7:57 pm
  • Avatar satyro

    Mil gracias compadre… estuve toda la tarde de ayer y la mañana de hoy hasta que encontre tu post bien explicadito.
    saludos

    February 10th, 2010 at 2:20 pm
  • Avatar Martin

    GENIO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! El unico que me dio la solución….

    +10 si hubise puntos

    February 22nd, 2010 at 5:37 am
  • Avatar UnMandrango

    Despues de darle mil vueltas por fin lo soluciono! me faltaba el mysql_query(“SET NAMES ‘utf8′”);

    Muchas gracias!

    February 22nd, 2010 at 9:20 pm
  • Avatar diego

    juas quitar –>htmlentities() para solucionar acentos eso si que es ser suicida, pues terminaras con acentos pero con terrible xss en tu web…
    saludos!

    February 23rd, 2010 at 11:14 pm
  • Avatar carvill23

    Te puedo decir que en un servidor deje los htmlentities() y funciona de maravilla, sin embargo en otro servidor tuve que quitarlos, mi recomendación es dejarlos en la medida de lo posible.

    March 3rd, 2010 at 2:27 am
  • Avatar Marcos Huerta Hernandez

    de lujo gracias amigo todo funciona a la perfeccion en cualquire sitio si no hago todo funciona en algunos pero si aplico todo en todos mis sitio funciona

    March 10th, 2010 at 4:57 pm
  • Avatar James

    genial…. el paso 4 igual solucionó mi problem. saludos

    March 10th, 2010 at 6:31 pm
  • Avatar kapry

    Muy interesante por cierto.
    Muchas gracias ;)

    March 12th, 2010 at 3:37 pm
  • Avatar Mario Torres

    Excelente! A punto de soltar llanto por frustración, encuentro la solución en tu página y problema resuelto!!! =)
    Aparte de agradecerte, quiero agradecerte =D jeje
    Bueno, saludos y muchas GRACIAS

    March 24th, 2010 at 6:41 am
  • Avatar Eladio

    Muchas gracias el paso 4. Y lo mismo de todos los demás tras tragar mucha mierda por google alguien que da soluciones… Muchas gracias

    March 26th, 2010 at 2:35 am
  • Avatar kesonch

    estuve buscando todas las vacaciones
    esta respuesta. te pasaste, ademas ke
    estan super claros los pasos.

    Saludos muchas gracias loko

    April 1st, 2010 at 8:09 am
  • Avatar Fernando

    Hola Xavi, me solucionaste el problema haciendo la consulta de SET NAMES.
    Si alguien usa msqli como yo la linea es:

    $acentos = $db->query(“SET NAMES ‘utf8′”);

    Muchas gracias.

    April 5th, 2010 at 8:24 pm
  • Avatar Error con acentos y eÑes en PHP/MySQL [Solución Definitiva] « 10goto10

    [...] vía Error con acentos y eÑes en PHP/MySQL [Solución Definitiva] by XaviEsteve. [...]

    April 21st, 2010 at 4:19 pm
  • Avatar Kendall

    Buenas tardes mi problema es a la hora de insertar un correo, me quita el @ y me pone %40 y no me deja realizar la inserción… No se que hacer estoy desesperado ya q es mi trabajo de grado, lo peor es q en windows me funciona perfecto y en linux se caga todo.

    April 23rd, 2010 at 8:37 pm
  • Avatar Xavi

    Hola Kendall, eso te pasa al enviar formularios? Parece que la @ se convierte a %40 antes de llegar a insertarse en la base de datos. Cuelga un enlace a la web o un ejemplo y lo miramos.

    April 25th, 2010 at 9:14 pm
  • Avatar Gomosodo

    Gracias tío,
    mysql_query(“SET NAMES ‘utf8′”);

    April 26th, 2010 at 6:10 pm
  • Avatar JORGE

    Gracias compadre, funcionó de maravilla. Te debo una!

    May 7th, 2010 at 4:59 pm
  • Avatar Jose

    Te idolatro tio. Eres un genio. De golpe has hecho que todos mis problemas se resuelvan. Si por lo que sea quieres poner algo en mi web http://planeatuboda.net estás invitado.
    Gracias de nuevo,

    May 20th, 2010 at 1:53 pm
  • Avatar Haruhi

    Eres grande, la 4ta solución fue la que me sirvio. Gracias!

    May 27th, 2010 at 4:37 am
  • Avatar Alejandro garcia

    Tengo Problema tengo en la cotejamiento de la base de datos es utf8_unicode_ci y la tabla tambien y el campo es utf8_spanish_ci y en el archivo php esta desactivada el default_chaset espero que me puedas ayudar

    function fAgregarRegistro($vIdProfesor,$vTipo,$vCarrera,$vCatedra,$vUsuario,$vClave){
    include_once(‘db/class.conexion.php’);
    $vSql=sprintf(“INSERT INTO tblusuarios (idprofesor,idtipo,idcarrera,catedra,usuario,clave,activo) VALUES(%s,%s,%s,%s,%s,%s,%s)”, GetSQLValueString($vIdProfesor, “int”),
    GetSQLValueString($vTipo, “int”),
    GetSQLValueString($vCarrera, “text”),
    GetSQLValueString($vCatedra, “text”),
    GetSQLValueString($vUsuario, “text”),
    GetSQLValueString($vClave, “text”),
    GetSQLValueString(1, “int”)
    );
    fConexionDB($vSevidor=fVServidor(),$vUsuario=fVUsuario(), $vClave=fVClave(), $vBaseDato=fVBaseDato());
    mysql_query(“SET NAMES ‘utf8′”);
    $vQuery = fConsultaDB($vSql);

    }

    May 28th, 2010 at 12:01 am
  • Avatar Xavi

    @Alejandro garcia: cual es el problema? has probado a seguir todos los pasos descritos arriba?

    May 28th, 2010 at 10:28 am
  • Avatar Alejandro Garcia

    ya los hice en el pero no me funciona y no se porque tengo todo según los paso que esta el parte superior

    May 28th, 2010 at 3:33 pm
  • Avatar Néstor Herrera

    Amigo: Estoy incursionando en todo este mundillo del desarrollo web, una frustación muy grande fué que al lograr grabar en mysql los acentos y eñes se veían algo raro .. jaja :D en fin.. me has salvado !! Gracias !!

    May 31st, 2010 at 7:01 pm
  • Avatar Néstor Herrera

    A Propósito, fuí probando todo, cambiando los collage a UTF_espaoll_ci y nada .. que nada. Entonces Apliqué en mi form de entrada el PASO 4 y aloja !! mysql_query(“SET NAMES ‘utf8′”); es la solución DEFINITIVA. GRACIAS NUEVAMENTE !!!

    May 31st, 2010 at 7:03 pm
  • Avatar Rossy

    Hola, no sabia muy bien lo que hacia, solo segui los pasos lo mejor posible, y listo!!…..grata fue mi sorpresa, porque funciona y funciona muuy bien.

    imposible quedarse sin comentar y si agradecer.
    saludos..

    June 18th, 2010 at 12:24 am
  • Avatar DbRunas – Noticias y Recursos sobre Bases de Datos » TIP: Error con acentos y eÑes en PHP/MySQL (Solucionado)

    [...] http://xaviesteve.com/acentos-y-enes-aparecen-mal-a%C2%B1-en-php-con-mysql-utf-8-iso-8859-1/ [...]

    June 21st, 2010 at 12:07 am
  • Avatar Tony

    Mi caso es un poco diferente y veo que aqui todos estan felices de haber resuelto el problema, la base de datos fue creada usando latin1_swedish_ci y uso un script, (ADP), que fue actualizado a utf_unicode_ci, el problema es que los primeros 3,000 registros se ven con signos y resuelvo el problema usando un encabezado (ISO-8859-1) pero sigo entrando cada registro quitandole los acentos y no usando la ñ, como puedo convertir la DB completa a Unicode UTF-8 ?

    June 23rd, 2010 at 1:43 pm
  • Avatar Alejandro

    Mi caso es diferente y tengo un gran problema, ya me quite de las molestias de los acentos, se ven y todo marcha bien, pero aún así necesito quitar lo acentos de una cadena de texto.
    Esta cadena de texto viene de un formulario de registro de usuarios que hice previamente, si yo hago echo $nombre; el nombre sale con todo y sus acentos, pero, recordemos que quiero quitar los acéntos, encontre una función en internet:
    function elimina_acentos($cadena){
    $tofind = “ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ”;
    $replac = “AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn”;
    return(strtr($cadena,$tofind,$replac));
    }
    echo elimina_acentos($cadena);

    pero si ejecuto la función, me muestra algo como esto:
    si pongo Gómez, obtengo como resultado gnimez
    ¿qué puedo hacer?

    July 23rd, 2010 at 8:43 pm
  • Avatar Xavi

    Hola Alejandro,
    El problema con tu codigo es que estas pasando todas las letras como una palabra entera. Tienes que pasarlas como una matriz:
    function elimina_acentos($cadena){
    $tofind = array(‘à’,'á’,'â’,'ã’,'ä’, ‘ç’, ‘è’,'é’,'ê’,'ë’, ‘ì’,'í’,'î’,'ï’, ‘ñ’, ‘ò’,'ó’,'ô’,'õ’,'ö’, ‘ù’,'ú’,'û’,'ü’, ‘ý’,'ÿ’, ‘À’,'Á’,'Â’,'Ã’,'Ä’, ‘Ç’, ‘È’,'É’,'Ê’,'Ë’, ‘Ì’,'Í’,'Î’,'Ï’, ‘Ñ’, ‘Ò’,'Ó’,'Ô’,'Õ’,'Ö’, ‘Ù’,'Ú’,'Û’,'Ü’, ‘Ý’);
    $replac = array(‘a’,'a’,'a’,'a’,'a’, ‘c’, ‘e’,'e’,'e’,'e’, ‘i’,'i’,'i’,'i’, ‘n’, ‘o’,'o’,'o’,'o’,'o’, ‘u’,'u’,'u’,'u’, ‘y’,'y’, ‘A’,'A’,'A’,'A’,'A’, ‘C’, ‘E’,'E’,'E’,'E’, ‘I’,'I’,'I’,'I’, ‘N’, ‘O’,'O’,'O’,'O’,'O’, ‘U’,'U’,'U’,'U’, ‘Y’);
    return(strtr($cadena,$tofind,$replac));
    }
    Creo que falta la eñe minuscula y quizas alguna letra mas pero haciendo unos arreglillos te deberia funcionar :)

    Un saludo,
    Xavi

    July 23rd, 2010 at 8:51 pm
  • Avatar Pablo

    En mi caso el problema era simplemente el mysql_query(“SET NAMES ‘utf8′”)

    Gracias.

    July 26th, 2010 at 8:59 am
  • Avatar damian

    Nose como agradecerte !!!!!!!!!! jajajaja saludos

    August 1st, 2010 at 6:49 am
  • Avatar juan jesus flores

    el 4 pso me ayudo y gracias.

    August 6th, 2010 at 10:49 pm
  • Avatar Alejandro Vzlno

    Hola amigo un millon de gracias!!!!!! la verdad ahora me guarda los acentos en la BD sin rollo alguno, MAS FINO!el problema es q ahora cuando quiero mostrar los datos de la BD en una lista desplegable por ejemplo de clientes , estos me salen con un simbolo raro donde van los acentos, que crees que pueda ser’? si puedes porfa Resp te lo agradeceria.!1

    August 19th, 2010 at 7:24 pm
  • Avatar Andrés Torres

    Ya tenía realizado los primeros pasos, me faltaba lo último al parecer, pero… el problema persiste, se que es apache el del problema porque faltan acentos en los datos estáticos que hay en mis archivos .php y lo que se carga de la base de datos está perfecto, en fin, busqué por todos lados dentro de apache y no encontré AddDefaultCharset, por lo que lo seteé abajo de mi httpd.conf, reinicié apache y el problema persiste. Estoy en una face “alpha beta” aún en mi proyecto lo cual no utilizo htmlentities() ni nada por el éstilo, podrás acercarme una ayuda?

    August 24th, 2010 at 2:09 pm
  • Avatar Optim

    Excelente! Hace una semana que estaba intentando solucionar este problema. Agregué la consulta SET NAMES ‘UTF8′ y… santo remedio! Muchas gracias.

    September 4th, 2010 at 7:13 pm

Comment Form

  • PHP absolute server path to website (the easy and fastest way)

    PHP absolute server path to website (the easy and fastest way)

    8 Jun 2010

    Here’s a quick note for all those people wondering what the absolute path to their server is. There are many tools and solutions around the Internet that help you find it, as well as php_info() …

  • Regroup with your squad BUG in Call of Duty 5 (cod5) – World at War

    Regroup with your squad BUG in Call of Duty 5 (cod5) – World at War

    15 Dec 2008

    When ending one of the first missions against the Japanese in Call of Duty 5 and in some other versions like Call of Duty 4 and World at War, the game tells you to “Regroup with your squad”…