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 te ha servido este artículo ahorra la frustración a otros programadores compartiendo el artículo, Tweetea en Twitter o Comparte en Facebook.

Como último consejo, si estás aprendiendo PHP y MYSQL te recomiendo que te leas el libro PHP y MySQL de O’Reilly (enlace a la edición de tapa blanda que es más barata) ya que es muy completo y te ayudará a entender todos los problemas de charsets y demás obstáculos a los que te enfrentarás en el futuro.

Fotografía por Eduardo

Living in United Kingdom? Read about the best mobile phone network in the UK.

               
       

Comments

173 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
  • Avatar andres

    Agradezco tu manual, tenia el mismo problema y lo solucione con el paso 4, pero al enviar un formulario con la letra ç me la devuelve como %C3%A7 y no me la encuentra en la base de datos como podria solucionarlo

    September 20th, 2010 at 5:51 pm
  • Avatar orregol

    grande maestro estuve días probado estupideces hasta que lo encontré a usted

    September 30th, 2010 at 5:47 am
  • Avatar Armando

    Apliqué los 4 pasos para no fallarle. Me funcionó perfecto.
    Muchas gracias. Excelente Resumen

    October 14th, 2010 at 6:49 pm
  • Avatar Xavi

    Para los que tengais problemas importando bases de datos o tablas con el hosting de 1and1 probad lo siguiente:
    - Subid la base de datos a un servidor con una version mas reciente de phpMyAdmin (puede ser vuestro servidor local)
    - Exportad la base de datos
    - Sin abrir el archivo .SQL con ningun programa, importadla en el phpMyAdmin de 1and1

    October 19th, 2010 at 1:10 am
  • Avatar Vladimir Toledo

    Excelente tuto amigo, ya resolví el problema que tenía con ñ’s y acentos. En resumen apliqué tres pasos:

    1.- Generé los scripts para la recreación de mis tablas y los modifiqué para que quedaran de la siguiente forma:

    CREATE TABLE `xqd_accesos` (
    `xqd_acceso` varchar(20) NOT NULL,
    `xqd_fecha` date NOT NULL,
    `xqd_hora` time NOT NULL,
    `xqd_entidad` int(8) NOT NULL,
    `xqd_usuario` varchar(32) NOT NULL,
    PRIMARY KEY (`xqd_acceso`)
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_spanish_ci;

    Con esto los campos varchar y char, al ser recreados mediante el script heredaron las propiedades de la tabla.

    2.- Agregué la línea a la que haces mención en todas las páginas de mi sitio, en el header.

    3.- En la función que hace la conexión a la base de datos, después de hacerla, ejecuté el script que mencionas y voilá, furuló.

    Gracias por el dato…

    October 19th, 2010 at 7:54 pm
  • Avatar Manu

    Muchas gracias por el articulo, me fue muy util

    October 26th, 2010 at 11:52 am
  • Avatar Carolina

    Mil pero mil gracias! Me estaba volviendo loca y ahora me muestra y guarda bien los acentos :)

    November 10th, 2010 at 3:04 pm
  • Avatar Fav

    Muchas gracias teníamos casi un día completo buscando la solución, el paso 4 fue el que nos resolvió el problema.
    Gracias y FELICIDADES por la aportación.

    November 13th, 2010 at 2:18 am
  • Avatar Néstor

    Muchas gracias!!!
    Como a otros usuarios, el paso que me ha servido es el 4.

    ; )

    December 12th, 2010 at 5:23 pm
  • Avatar Marco Diaz desde Chile.

    Muchas gracias, al igual que los otros usuarios tenia bastante rato buscando la solucion con una consulta mysql en php, la cual no me mostraba los acentos ni la ñ, ahora con la solucion 4 me funciona perfecto, ya estaba buscando los archivos de apache para meter la picota jajaja, gracias.

    December 15th, 2010 at 2:18 am
  • Avatar Armando Borge

    Thanksssssssss…!!! Good Post…!!! Great Solutions…!!!

    December 15th, 2010 at 2:31 am
  • Avatar Gustavo

    Encontré ese problema de codificación, en unas consultas elementales displayadas sobre el navegador, la ausencia de acentos(como si los hubiera filtrado, sin embargo en PHPMyAdmin se ve bién), lo extraño es que algunas la consulta salió bién. A raíz que copié (para restaurar) los archivos de una base de datos de otro sistema Wamp a uno llamado Xamp donde seguro son distintas codificaciones, no he visto aún este detalle pero agradezco tu resumén y los demàs aportes, se que me servirán para corregir este error.

    December 16th, 2010 at 11:16 pm
  • Avatar Bonyie

    Hola Xavi y demas:

    Tengo bastante ratos con el problemilla de los acentos y lod ejaba para lo último, hacia todo el sistema de páginas y al último atacaba ese problemilla con diversos consejos de cuates y de búsquedas en google, a veces resultaban y a veces nop. Emplee el SETLOCALE() y nada

    Hoy encontre una solución sencilla que al menos para la página que estoy haciendo a funcionado bien.

    Mi bases de datos, todos los campos y la tabla las tengo en utf8_spanish_ci o utf8_unicode_ci o utf8_general_ci y con mi búsqueda de hoy he encontrado que en todas las páginas que tienen consulta a la BD en la linea:

    cambiar el CHARSET

    January 3rd, 2011 at 9:12 pm
  • Avatar Bonyie

    charset=utf-8 por charset=iso-8859-1

    January 3rd, 2011 at 9:13 pm
  • Avatar Javier Flores Moreno

    Llevo todo el fin de semana dándole vueltas… me he salvado gracias a este blog.

    January 30th, 2011 at 10:57 pm
  • Avatar JvC

    Buena info, saludos!

    February 9th, 2011 at 10:02 pm
  • Avatar alvarosulfúrico

    Mil gracias tío.
    Llevaba toda la mañana con esta tontería.
    Por fin lo he solucionado gracias a tus consejos.

    February 13th, 2011 at 9:59 am
  • Avatar fernando

    Amigo tengo un problema cuand muestro los datos en pantalla no tengo problemas con los acentos pero a la hora de mostrarlo en un reporte los cuales genero con FPDF ya comienzan los problemas me lo muestra con áóñ ya intente seguir tus paso pero nada que sera q habra de diferente espero q me puedas ayudar

    February 13th, 2011 at 6:54 pm
  • Avatar sensei

    Muchas gracias.. muy valiosa la información.

    February 15th, 2011 at 3:24 pm
  • Avatar Eloi

    Hello:

    Todavia no logro solucionar mi problema, te agradeceria tu ayuda, intente lo que dijiste, despues introduje manualmente los acentos y ñ’s en la base de datos, cuando abro mi pagina en php, se ven los acentos y ñ’s, el problema es cuando cargo un combobox de la base de datos, en ese combobox, no muestra los acentos,alguna sugerencia? sabes que estoy haciendo mal?

    February 21st, 2011 at 5:04 pm
  • Avatar Xavi

    Hola Eloi, cual es la URL de la pagina que da problemas?

    February 21st, 2011 at 5:12 pm
  • Avatar Eloi

    1 1

    February 21st, 2011 at 5:50 pm
  • Avatar Zovc

    mysql_query(“SET NAMES ‘utf8′”);

    Esta instrucción es la definitiva, el paso 4 me ha salvado, muchas gracias!!!!!

    February 23rd, 2011 at 1:31 pm
  • Avatar nicolacho

    El paso 4, bailo de alegria, jejeje! Muy buena onda, gracias

    February 25th, 2011 at 5:45 am
  • Avatar Lolo

    Para los quieran trabajar y guardar los datos en iso-8859-1. Tened en cuenta que las llamadas en post en JQuery, siempre codifican los datos de formulario en la peticion en utf-8. Asi que si antes de insertar en la BD, en vuestros script php de servidor, utilizais la función utf8_decode () os convertirá los datos de formulario codificados de utf-8 a iso-8859-1. me han dado quebraderos de cabeza hasta encontrar la solución..

    March 12th, 2011 at 11:21 am
  • Avatar Jorge

    Muchísimas gracias, me acabas de ahorrar horas de trabajo gracias a la línea:

    mysql_query(“SET NAMES ‘utf8′”);

    Eres grande.

    March 27th, 2011 at 8:17 pm
  • Avatar gabriel

    gracias por tomarte el trabajo de hacer esa compilación, me ayudaste, solucioné el problema con los acentos :)

    March 28th, 2011 at 12:50 am
  • Avatar Benji

    Fijate que solo con el paso 4 (y en mi caso el 6 porque no tenía la solución) me solucionó el problema.

    Pero a partir de ahora todas mis bases de datos las crearé como dices en el paso 1

    March 29th, 2011 at 8:15 pm
  • Avatar Xavi

    Hola Benji,

    Tienes razon, el paso 4 es el que soluciona los problemas, los pasos 1 a 3 estan ahi para que ya de paso tambien se implementen y en un futuro ahorren otro tipo de problemas que suelen aparecer :)

    March 29th, 2011 at 8:35 pm
  • Avatar Valeria

    Hola,

    Muchas gracias por el aporte! Me solucionó el problema!

    March 31st, 2011 at 3:36 pm
  • Avatar Luis Macias

    No tienes idea de a cuantos “chamanes” consulte. La verdad es que otro poco y mis usuarios deciden olvidarse de los acentos y… entre mi jefe y la Real Academia seguro harian un gran festin!

    Gracias!

    April 5th, 2011 at 4:21 am
  • Avatar Sino

    Muchísimas gracias!! es lo que buscaba.

    April 14th, 2011 at 5:24 pm
  • Avatar javier campuzano

    esta es la real solución del problema gracias!!!!!

    April 20th, 2011 at 3:29 pm
  • Avatar Jose Collazos

    Muy buen aporte… muy buen resumen…
    A mi me funcionó el item 4

    Gracias

    April 24th, 2011 at 3:20 am
  • Avatar Patricio Lillo

    excelente!!!! muchas grcias T_T llevo mxo tiempo tratando de arregla sto

    May 1st, 2011 at 5:37 pm
  • Avatar Fatima

    Hola, estoy haciendo un sistema en php y mysql. Inicialmente los acentos de los datos traidos desde la BD se veian sin problema, luego empezaron a aparecer unos cuadritos negros en los select y cuadros en el resto de las variables. Trabajo con MVC y PDO, se soluciono con el paso 4 todo bien hasta que probe una parte de mi sistema que lee archivos .cvs y cuando se conseguia un acento en algun campo del archivo me da SQLSTATE[HY000]: General error: 1366 Incorrect string value: ‘\xEDa Ale…’ for column ‘NOMBRES’ at row 1

    May 2nd, 2011 at 1:24 pm
  • Avatar Nicole

    me he pasado horas en esta tonterita… Gracias!!!

    May 2nd, 2011 at 11:10 pm
  • Avatar Briones

    a qui hay otra solución que a mi me funciono. Lo unico que hice fue agregar esta linea al inicio de mi pagina .php:
    header(‘Content-Type: text/html; charset=iso-8859-1′);

    May 3rd, 2011 at 4:57 am
  • Avatar leandro d m

    me sirvio el paso 4 ! gracias

    May 3rd, 2011 at 6:09 pm
  • Avatar DragonRojoHispano

    Varios días buscando, un programa que se encargaba de leer los campos de una base de datos para traducir á por á y después de todo, encuentro esta página.

    El único problema que le veo es haber tardado tanto en encontrarla.

    mysql_query(“SET NAMES ‘utf8′”);

    Una frase muy sencilla que arregla muchos problemas.

    May 4th, 2011 at 9:01 am
  • Avatar dukanista

    No puedo más que darte las gracias, una y mil veces, llevo buscando y buscando y buscando, exportando la base de datos entera y volviendola a importar con distintos collation, la opción de encode y utf8_encode() y utf8_decode() no la podía usar porque pasaba por las mismas funciones unas veces con ajax y otras submitiendo formularios y a veces codificaba a utf8 texto que ya estaba en utf8 y al revés dando un resultado no deseado y la solución ahí estaba, con una simple línea en un único archivo a la hora de hacer la conexión, el paso 4 bendito sea!!! ya puedo seguir desarrollando la web porque me daba miedo seguir haciendolo con la mosca detrás de la oreja de que tendría que cambiar en algún momento toooodas las querys, pero mysql_query(“SET NAMES ‘utf8′”); me ha salvado. Muchísimas gracias.

    May 26th, 2011 at 11:09 am
  • Avatar Xavi

    Hola Dukanista,
    Me alegro que te haya servido! En su dia tambien me pase unas cuantas horas (si no dias) desesperado para encontrar la solucion…
    Ayuda a difundir la palabra compartiendo este articulo a tus amigos y otros programadores via Twitter, Facebook, foros, etc. Te lo agradeceran!

    May 26th, 2011 at 11:27 am
  • Avatar MarBcn

    Esto también sirve para trabajar con el catalán? (Trabajo con el catalán y el castellano.) He probado solo el paso 4 y no funciona. Lo pregunto porque si realizar todos los pasos sirve tendria que crear nuevamente la base de datos desde cero.

    June 3rd, 2011 at 12:02 pm
  • Avatar Xavi

    Hola MarBcn,
    Sirve para catalan y todos los idiomas que tienen acentos.
    No creo que tengas que crear la BD desde cero otra vez, comprueba que en la BD se vea bien (con phpMyAdmin u otro cliente MySQL) y si ahi esta bien entonces solo ves siguiendo los pasos uno por uno hasta que te funcione todo.

    June 3rd, 2011 at 12:49 pm
  • Avatar Miguel

    Por favor podrian poner pedazos de codigo ó detallar como insertados esos codigos que usted emnciona en la pagina, son novato y no se como hacerlo gracias.

    June 15th, 2011 at 4:17 pm
  • Avatar Xavi

    Hola Miguel,

    Si no sabes donde se tienen que poner cada codigo te aconsejo que antes de corregir los errores de acentos, estudies un poco mas de HTML, PHP, MySQL, Apache y htaccess.

    Una vez tengas clara la gramatica de cada lenguaje entenderas las instrucciones de este articulo mucho mejor ya que son muy sencillas. Animos y suerte :)

    June 15th, 2011 at 4:24 pm
  • Avatar David

    Gracias por el Tip, solo que te Falta mas explicacion
    o ejemplos
    Ejemplo:

    June 25th, 2011 at 3:07 am
  • Avatar David

    El punto 4 funcionó para mi. Gracias!

    June 28th, 2011 at 10:02 pm
  • Avatar @ucraman

    El 4to paso me salo la vida . Sos un groso. Una pegunta como hiciste el fondo de tu web. Saludos.

    June 30th, 2011 at 11:44 pm
  • Avatar Map

    Excelente solución. Tengo una librería con el mysql_connect y puse el mysql_query(“SET NAMES ‘utf8′”); justo en la siguiente línea. Funciona perfecto. Gracias!

    July 7th, 2011 at 5:07 pm
  • Avatar Jesus

    Mi amigo, muchisimas gracias, ya me estaba doliendo la cabeza con esto. pero gracias a tu articulo me ayudaste mucho.

    de nuevo muchaaaaaaaaaaaaas gracias

    July 8th, 2011 at 10:14 pm
  • Avatar LoThaR

    Capo!!

    Aqui estaba el tema: mysql_query(“SET NAMES ‘utf8′”);

    July 13th, 2011 at 9:00 pm
  • Avatar Alvaro

    Muuuuuchas gracias… el cuarto paso es el verdadero, porque intente todo de verdad gracias Dios te Bendiga…

    July 15th, 2011 at 3:28 am
  • Avatar niux

    Gracias Xavi,

    he podido solucionar la entrada de datos a la DB pero todavía me devuelve caracteres extraños.

    July 26th, 2011 at 12:06 pm
  • Avatar julio balderas

    eres grande, estuve probando soluciones dadas en otros sitios (como 2 horas) hasta que llegue a tu pagina..de los mas sencillo. Son detallitos que se le pasan a uno cuando recien inicias en estos menesteres.

    gracias. saludos.

    August 4th, 2011 at 12:50 am
  • Avatar Eduardo Ferrón

    Muchas gracias, resolviste un dolor de cabeza de una forma sencillísima :)

    August 12th, 2011 at 2:30 pm
  • Avatar Carlos66

    Hola, muy bueno el articulo, pero tengo una duda tal vez tonta, pero es que en el cotejamiento de tablas no encuentro la opcion utf_unicode_ci

    Me sale es utf8_unicode_ci, utf16_unicode_ci y utf32_unicode_ci
    Tengo la version phpadmin 3.3.9

    Cual elijo de esas, si no sale la que mencionas?

    Gracias.

    August 12th, 2011 at 11:28 pm
  • Avatar John

    Me has salvado la vida! Gracias! Bendiciones!

    August 12th, 2011 at 11:37 pm
  • Avatar Andres

    Mil gracias, mucha gente dice tener la solución pero nada.. finalmente aquí encontré la solución,

    Gracias.

    August 16th, 2011 at 9:19 am
  • Avatar Ernesto

    Mil gracias me has solucionado el problema que arrastraba desde hace mucho tiempo. El paso 4 ha sido clave.

    August 17th, 2011 at 3:43 pm
  • Avatar Ana

    Muchas gracias por tu aclaración.Internet explorer era el que daba problemas. Con Mozilla se visualizaba bien. De repente en la página desaparecieron los acentos y las ñ, y como no se html no sabía como solucionarlo, y así llevaba meses, cuando hoy encontré tus instrucciones… En 2 minutos problema solucionado.Con el paso 2 fue suficiente. Nuevamente gracias

    August 25th, 2011 at 12:20 am
  • Avatar Santiago

    el paso 4 es el que me sirvio!!!!!!!!!!
    puse esa linea en el archivo que tiene los datos de la coneccion a la base de datos y se me solucionaron los acentos en todo el sitio
    Gracias!!!!!!!!!
    pd: por si a alguien le sirve, adjunto el contenido del archivo

    $hostname_conn = “dfbhdfghdfhdfhdfh.com”;
    $database_conn = “nombre_de_la_base”;
    $username_conn = “usuario”;
    $password_conn = “passss”;
    $conn = mysql_pconnect($hostname_conn, $username_conn, $password_conn) or trigger_error(mysql_error(),E_USER_ERROR);
    mysql_select_db($database_conn);
    mysql_query(“SET NAMES ‘utf8′”); // ESTA ES LA LINEA QUE AGREGUE

    August 26th, 2011 at 5:36 am
  • Avatar Johez

    El paso 4 es el que me funciono. excelente un diez por esa nota.

    August 26th, 2011 at 6:01 pm
  • Avatar Arfio

    como a todos el paso 4 fue la solucion.

    Gracias. un buen aporte.

    August 31st, 2011 at 11:25 pm
  • Avatar EditionXav

    brother mil gracias esta muy bueno tu post del tema ya tenia rato que quería solucionar esto….
    sigue así grax

    September 1st, 2011 at 9:24 pm
  • Avatar Luis Miguel

    Hola

    Y un truco más, existen dos funciones de php utf8_encode() y utf8_decode(), pues utilizas la que proceda (fuente: http://www.php-es.com/language.types.string.html ).

    Un saludo

    September 2nd, 2011 at 9:56 am
  • Avatar jajlil

    Bro, buenas notas .. resolvió mis broncas, chido por el aporte

    September 3rd, 2011 at 12:23 am
  • Avatar migovilo

    Gracias, el encode del paso 2 me sirvió. Saludos. :)

    September 5th, 2011 at 3:51 am
  • Avatar Diego

    Eres lo máx. thanks

    September 7th, 2011 at 9:54 pm
  • Avatar Cristian

    Buenos días,
    pues yo no consigo solucionarlo, debo ser muy cortita.
    Por favor si me puedes ayudar, te explico lo que tengo:
    1.En la base de datos la tabla agenda que la he modificado utf8_unicode_ci en operaciones–>cotejamiento.

    2.Los campos (nombre, dirección, email) los he cambiado también a utf8_spanish_ci

    3.Mi archivo test_acentos.php tengo:

    Actualización de base de datos

    Actualizacion de base de datos

    Subcategoria

    <?php

    $link=mysql_connect("localhost","root","xxx");
    mysql_query("SET nombre 'utf8'");
    mysql_select_db("mysql",$link);

    echo"”;

    $sql=”SELECT nombre FROM agenda”;

    $result=mysql_query($sql);

    $i=0;
    while ($row=mysql_fetch_row($result))
    {
    echo “”.$row[$i].”\n”;
    }
    echo “”;
    ?>

    September 16th, 2011 at 10:22 am
  • Avatar Matias

    Muchas gracias!!! hace rato venia buscando una solucion a esto! y era la base de datos nomas… muy util

    September 17th, 2011 at 2:28 am
  • Avatar Daniel

    Muchas gracias. Me ha servido bastante

    September 25th, 2011 at 3:48 am
  • Avatar Alberto

    Gracias amigo, el paso 4º es el que me funcionó. Me has ahorrado mucho tiempo. ¡Eres un crack!

    September 28th, 2011 at 8:11 am
  • Avatar Rubroch

    Eres un genio mi estimado. Muchas gracias !!!

    September 30th, 2011 at 1:25 am
  • Avatar Rubroch

    Saludos desde México, D.F. !!!!

    September 30th, 2011 at 1:26 am
  • Avatar adiazq

    Excelente, me sirvio el paso 4!

    October 5th, 2011 at 11:15 pm
  • Avatar Frank Molina

    Excelente, me resolvió el paso 4, suficiente
    Gracias

    October 10th, 2011 at 7:57 pm
  • Avatar occiso

    Me salvaste men
    el paso 4 me solucionó los “null” que me mostraba un combobox con ciudades y municipios. MUY AGRADECIDO.

    =D

    October 11th, 2011 at 1:59 pm
  • Avatar ship

    guena me salvaste

    October 11th, 2011 at 10:14 pm
  • Avatar Acentos y eñes en HTML/PHP | DISANING WEBS

    [...] Apache o modifícalo6) Como última y desesperada opción, quita todos los htmlentities();FUENTE: XAVIESTEVE.COM Publicado en DHTML, PHP, Publicaciones, Publicaciones | No hay comentarios Deja un comentario [...]

    October 12th, 2011 at 1:10 am
  • Avatar Solución problema Ñ y Acentos (´) | @luinux

    [...] xaviesteve.com [...]

    October 15th, 2011 at 4:36 am
  • Avatar Luinux

    Muchas gracias, funciona perfecto!!

    October 15th, 2011 at 4:40 am
  • Avatar Ariel Maluenda

    Es increíble como días de desesperación se terminan con esta pequeña línea de código :

    mysql_query(“SET NAMES ‘utf8′”);

    Muchas Gracias!

    October 20th, 2011 at 2:19 am
  • Avatar chemo

    ta que la solucion 4 esta de lujo las otras soluciones nunca me funcionaron daban coleraaa como pa agarra a patadas la pc cuando algo no te sale xD

    October 24th, 2011 at 11:58 am
  • Avatar Juls

    Genial!!! y encima he tenido la suerte de encontrarlo a la primera ;).

    October 26th, 2011 at 6:02 am
  • Avatar Leandro

    Gracias por la solucion!! El punto 4 me re sirvio!!! Se agradece!!!

    October 26th, 2011 at 8:30 pm
  • Avatar Jose Angel

    Yo tenía esté problema pero desde la importación de fichero de sentencias SQL, el problema era que estaba importando un fichero bajado de una web y el fichero no estaba en formato utf8. Cuando se guarda hay que asegurarse que el formato es utf8.

    October 30th, 2011 at 6:49 pm
  • Avatar kote

    Genial, funcionó a la perfección.

    October 30th, 2011 at 8:25 pm
  • Avatar max

    muchas gracis por compartir tu conocimiento aqui encontre lo q buscaba mucho tiempo el paso cuatro me sirvio de mucha importancia
    gracis!!!!!!!!!! de nuevo

    November 8th, 2011 at 4:07 am
  • Avatar kralf87

    Enserio la mejor respuesta que he recibido, si pude resolver mi error despues de tanto buscar. Muchas gracias. Esta comprobado

    November 9th, 2011 at 7:28 pm
  • Avatar Heli

    Muchas gracias bro… Simple, sencillo, y correcto!!!

    November 11th, 2011 at 3:54 am
  • Avatar Rafael

    Mil gracias!
    Me estaba rompiendo el coco con ese problema.
    Solucionado!

    November 15th, 2011 at 1:04 pm
  • Avatar ad-hok

    wena onda, el paso 4 es la salvacion :D

    November 15th, 2011 at 6:38 pm
  • Avatar joshua

    muy bien!

    lo de mysql_query(“SET NAMES ‘utf8′”); fue lo que me ayudo.. thanks

    November 18th, 2011 at 3:57 am
  • Avatar Erick

    Dias buscando una solución a este problema, hasta que san google me trajo al experto… viejo eres un master… gracias..!!!

    November 18th, 2011 at 12:47 pm
  • Avatar kira

    genial el post, me ayudó a solucionar mi problema! Gracias!

    November 23rd, 2011 at 4:36 pm
  • Avatar Andres Felipe

    Gracias me funcionó muy bien.

    November 27th, 2011 at 11:24 pm
  • Avatar Rafael Azuaje

    Hermano gracias totales!! Llevaba horas buscando ya me dolia la cabeza de tanto probar y nada… Me sirvio de maravilla!! Saludos!!

    November 28th, 2011 at 10:41 pm
  • Avatar Rex

    en verdad muchas gracias…….. me has salvado la vida……. te deseo mucho exito…

    December 1st, 2011 at 2:47 am
  • Avatar Davan Palma

    Pequeñas grandes soluciones.

    December 1st, 2011 at 4:19 pm
  • Avatar Paty

    Me sirvio el punto 4.

    Muchas Gracias¡ =)

    December 2nd, 2011 at 12:34 am
  • Avatar Andres

    Muchas gracias excelente tutorial me han salvado la vida

    December 2nd, 2011 at 1:08 am
  • Avatar vadrianac

    Esto esta mas q genial!! Me ayudo exageradamente demasiad0o0o0…ahora me evito una serie de rutinas que tenía preestablecidas para evitar est0o0o….muchisisisisisisisimas gracias!!!

    December 2nd, 2011 at 4:05 pm
  • Avatar Ezhaym N

    El paso 4 es una joya! gracias!

    December 4th, 2011 at 6:33 pm
  • Avatar Joseph

    Muchas Gracias, me salvaste de buenos dolores de cabeza!

    December 6th, 2011 at 7:14 pm
  • Avatar Gerson G. BJ

    Me funciono al la primera el de estoy usando dreamweaver cs5 sql con jquery y esta fue la solucion mas facil, rapida, no lo puedo creer aun, espero que tambien me fucione para formularios, por ahora solo manejo textos. Felicidades y muchas muchas gracias, El que sabe, sabe, Eres mi idolo.

    December 11th, 2011 at 4:59 am
  • Avatar Gidrek

    Me has salvado, esto es lo único que me faltaba para poder hacer mis gráficas =)

    December 12th, 2011 at 10:08 pm
  • Avatar rpd

    muchisimas gracias, me sirvio bastante.
    Supongo que ya lo habran puesto por arriba, pero ahi va un truco.
    No hace falta quitar todos los htmlentities, otros siguen haciendo falta. Por ejemplo, puede que al enviar los datos al mysql te los envie con acentos, pero que al mostrarlos, no. Y ahí es donde hace falta un htmlentities para solucionarlo!

    December 15th, 2011 at 6:26 pm
  • Avatar Aprendiendo PHP y MySQL (II) « Guías astronómicas

    [...] que PHP ofrecía están codificadas en Latin-1 en lugar de UTF-8. Afortunadamente, encontré este artículo que habla del tema y que solucionó todos los [...]

    December 18th, 2011 at 1:01 pm
  • Avatar Neiris

    Amigoooo… Muchisimas gracias. En realidad lo necesitaba…..

    January 5th, 2012 at 4:44 pm
  • Avatar Tory

    Paso 1 + Paso 4 = la solución para mi problema actual.

    Muchas gracias y espero que no te moleste que me haya “llevado” tu lista de pasos.

    January 6th, 2012 at 2:15 am
  • Avatar Frilex

    Buena graxias brother lo estaba buscando, bueno me funciono el 4to gracias…

    January 8th, 2012 at 10:06 pm
  • Avatar Silvio

    Muchas Gracias funciono ok!!! Yo también he renegando con esto por horas!!

    January 11th, 2012 at 11:01 pm
  • Avatar Pablo

    ¡Muchas gracias! La clave… el paso 4 ;-)

    January 17th, 2012 at 9:50 am
  • Avatar Rodolfo

    Con el paso 1 y el 4 GRACIAS!!!!!!!

    January 18th, 2012 at 6:52 pm
  • Avatar BJ_BlackCat

    Es muy interesante la solución que propones. Solo difiero en el punto de eliminar los htmlentities(), ya que estos (o al menos un parser) son requeridos para evitar la inyección de código a través de entradas en los formularios.

    De hecho, la mejor práctica es almacenar los datos con el charset utf-8, y al recuperarlos y trabajarlos por php siempre utilizar htmlentities() o htmlspecialchars(). Al final, para el usuario todo esto es transparente, y como desarrollador, tienes una medida más de seguridad para tus sitios web.

    January 19th, 2012 at 7:47 pm
  • Avatar pacomer

    Ya lo hice pero no funciono, estoy subiendo un archivo en txt delimitado con comas, el cual contiene acentos, al cambiarlo como dices, corta la palabra donde inicia el acento

    January 21st, 2012 at 8:04 pm

Comment Form