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
- Al crear la base de datos MySQL, asegúrate que los campos string y demás esten en
utf8_spanish_ciy el cotejamiento de las tablas en
utf_unicode_ci(más tarde en Operations > Collation de phpMyAdmin se puede cambiar) - Pon en el
<head>de todos los archivos HTML:<meta http-equiv="Content-type" content="text/html; charset=utf-8" />
- Y en los puramente PHP (que muestran XML, llamadas de AJAX, APIs…) pon el código:
header("Content-Type: text/html;charset=utf-8"); - 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) - Quita el
DefaultCharsetdel Apache o modifícalo - 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:
- ¿UTF-8 o ISO-8859-1? (lista de mails)
- Kanjis (escritura japonesa), acentos y eñes (foro)
- Codificación Latin1 y ñ (foro)
Fotografia por Eduardo
Comments
56 comments to Error con acentos y eÑes en PHP/MySQL (Solucionado)
Hermano muchas gracias!!
El paso 4 fue el que me sirvió.
Excelente, felicidades por este miniresumen!
June 2nd, 2009 at 6:07 amMuchas 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 pmMuchisimas gracias, me sirvio muchisimo!
June 21st, 2009 at 5:33 amEres un makina tronko :P… ¡yo de mayor quiero ser luckyshot!
ciao pescao
June 22nd, 2009 at 12:05 amTio, 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 amExcelente, muy buena ayuda a la comunidad de desarrolladores…
Muchas Gracias.
July 23rd, 2009 at 12:16 amSii, 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 pmHola! Por casualidad del destino encontré este blog! y plop! el paso 4 me fue de maravilla! muchas gracias!
August 13th, 2009 at 5:52 amEstoy comenzando a construir la página y tu ayuda fue muy importante.
September 1st, 2009 at 6:28 pmMuchas gracias.
El paso 4, siempre se me olvida, gracias por hacerme memoria.
September 6th, 2009 at 10:02 pmNo conocia el paso 4 y ha funcionado! Muchas gracias
September 15th, 2009 at 6:38 pmExcelente, 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 amme 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 pmHola 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 pmBAH!, 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 pmMuchiiisimas gracias.
November 19th, 2009 at 6:51 pmMuy buen aporte y muy bien explicado. !!!!!!
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 pmMuchas gracias, voy a linkear a este blog :D Gracias
January 17th, 2010 at 1:39 amMe has salvado la vida! 4 horas buscando la solución.
February 5th, 2010 at 9:18 pmperfecto 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 pmMuchas gracias por esta solución. Estuve varias horas probando con muchas alternativas que aparecen en la web y nada me resultaba.
February 8th, 2010 at 7:57 pmSaludos
Mil gracias compadre… estuve toda la tarde de ayer y la mañana de hoy hasta que encontre tu post bien explicadito.
February 10th, 2010 at 2:20 pmsaludos
GENIO!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! El unico que me dio la solución….
+10 si hubise puntos
February 22nd, 2010 at 5:37 amDespues de darle mil vueltas por fin lo soluciono! me faltaba el mysql_query(“SET NAMES ‘utf8′”);
Muchas gracias!
February 22nd, 2010 at 9:20 pmjuas quitar –>htmlentities() para solucionar acentos eso si que es ser suicida, pues terminaras con acentos pero con terrible xss en tu web…
February 23rd, 2010 at 11:14 pmsaludos!
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 amde 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 pmgenial…. el paso 4 igual solucionó mi problem. saludos
March 10th, 2010 at 6:31 pmMuy interesante por cierto.
March 12th, 2010 at 3:37 pmMuchas gracias ;)
Excelente! A punto de soltar llanto por frustración, encuentro la solución en tu página y problema resuelto!!! =)
March 24th, 2010 at 6:41 amAparte de agradecerte, quiero agradecerte =D jeje
Bueno, saludos y muchas GRACIAS
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 amestuve 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 amHola 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[...] vía Error con acentos y eÑes en PHP/MySQL [Solución Definitiva] by XaviEsteve. [...]
April 21st, 2010 at 4:19 pmBuenas 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 pmHola 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 pmGracias tío,
April 26th, 2010 at 6:10 pmmysql_query(“SET NAMES ‘utf8′”);
Gracias compadre, funcionó de maravilla. Te debo una!
May 7th, 2010 at 4:59 pmTe 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.
May 20th, 2010 at 1:53 pmGracias de nuevo,
Eres grande, la 4ta solución fue la que me sirvio. Gracias!
May 27th, 2010 at 4:37 amTengo 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@Alejandro garcia: cual es el problema? has probado a seguir todos los pasos descritos arriba?
May 28th, 2010 at 10:28 amya 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 pmAmigo: 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 pmA 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 pmHola, 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.
June 18th, 2010 at 12:24 amsaludos..
[...] 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 amMi 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 pmMi 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:
July 23rd, 2010 at 8:43 pmsi pongo Gómez, obtengo como resultado gnimez
¿qué puedo hacer?
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,
July 23rd, 2010 at 8:51 pmXavi
En mi caso el problema era simplemente el mysql_query(“SET NAMES ‘utf8′”)
Gracias.
July 26th, 2010 at 8:59 amNose como agradecerte !!!!!!!!!! jajajaja saludos
August 1st, 2010 at 6:49 amel 4 pso me ayudo y gracias.
August 6th, 2010 at 10:49 pmHola 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 pmYa 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 pmExcelente! 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