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

by
on May 23, 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. Cotejamiento
    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. Content type HTML
    Pon en el <head> de todos los archivos HTML:
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
  3. Content type PHP
    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. Set names
    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. Convertir codificado a UTF-8
    Convierte todo lo que esté codificado de latin1 a UTF-8 (gracias Guillermo)
    SELECT convert(cast(convert(content using latin1) as binary) using utf8) AS content
  6. Apache
    Quita el DefaultCharset del Apache o modifícalo
  7. htmlentities
    Como última y desesperada opción, quita todos los htmlentities(); y sustitúyelo por otro parser para ‘sanitizar’ los datos.

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 en Twitter, Facebook o Google+ con los botones de abajo.

Si estás empezando con PHP/MySQL te recomiendo utilizar el código que tengo publicado aquí que es seguro, fácil de usar y funciona muy bien. También está la versión en PDO utilizando named parameters que es incluso más sencilla.

Y si estás buscando un framework PHP te recomiendo Fat-Free-Framework (también conocido como F3), es de código abierto y rapidísimo de aprender y utilizar.

Fotografía por Eduardo

Nota Sólo quedan 10 invitaciones para 20GB de espacio gratis en Copy.com, ideal para compartir las fotos de vacaciones con los amigos.

Thank you for sharing the article

    
    

Xavi Esteve wrote this article on May 23, 2009 and published it in español, php, mysql and apache.

336 comments

  • chrono says:

    Hermano muchas gracias!!

    El paso 4 fue el que me sirvió.

    Excelente, felicidades por este miniresumen!

  • Miguel says:

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

    Un saludo y gracias de nuevo.

  • Nico says:

    Muchisimas gracias, me sirvio muchisimo!

  • skeksi says:

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

    ciao pescao

  • elsaforenc says:

    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!!

  • walter says:

    Excelente, muy buena ayuda a la comunidad de desarrolladores…

    Muchas Gracias.

  • yoa says:

    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!!!

  • Gerber says:

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

  • Raúl says:

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

  • David says:

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

  • Ayo says:

    No conocia el paso 4 y ha funcionado! Muchas gracias

  • Ray says:

    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.

  • peloon says:

    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 ???

  • Xavi Author says:

    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

  • Mauricio says:

    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…

  • Hernan says:

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

  • WeSkEr says:

    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

  • Heimdal says:

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

  • Enrique says:

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

  • Marcos huerta hrenandez says:

    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…

  • juan says:

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

  • satyro says:

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

  • Martin says:

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

    +10 si hubise puntos

  • UnMandrango says:

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

    Muchas gracias!

  • diego says:

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

  • carvill23 says:

    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.

  • Marcos Huerta Hernandez says:

    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

  • James says:

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

  • kapry says:

    Muy interesante por cierto.
    Muchas gracias ;)

  • Mario Torres says:

    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

  • Eladio says:

    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

  • kesonch says:

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

    Saludos muchas gracias loko

  • Fernando says:

    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.

  • Kendall says:

    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.

  • Xavi Author says:

    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.

  • Gomosodo says:

    Gracias tío,
    mysql_query("SET NAMES 'utf8'");

  • JORGE says:

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

  • Jose says:

    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,

  • Haruhi says:

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

  • Alejandro garcia says:

    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);

    }

  • Xavi Author says:

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

  • Alejandro Garcia says:

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

  • Néstor Herrera says:

    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 !!

  • Néstor Herrera says:

    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 !!!

  • Rossy says:

    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..

  • Tony says:

    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 ?

  • Alejandro says:

    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?

  • Xavi Author says:

    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

  • Pablo says:

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

    Gracias.

  • damian says:

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

  • juan jesus flores says:

    el 4 pso me ayudo y gracias.

  • Alejandro Vzlno says:

    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

  • Andrés Torres says:

    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?

  • Optim says:

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

  • andres says:

    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

  • orregol says:

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

  • Armando says:

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

  • Xavi Author says:

    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

  • Vladimir Toledo says:

    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…

  • Manu says:

    Muchas gracias por el articulo, me fue muy util

  • Carolina says:

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

  • Fav says:

    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.

  • Néstor says:

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

    ; )

  • Marco Diaz desde Chile. says:

    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.

  • Armando Borge says:

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

  • Gustavo says:

    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.

  • Bonyie says:

    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

  • Bonyie says:

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

  • Javier Flores Moreno says:

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

  • JvC says:

    Buena info, saludos!

  • alvarosulfúrico says:

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

  • fernando says:

    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

  • sensei says:

    Muchas gracias.. muy valiosa la información.

  • Eloi says:

    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?

  • Xavi Author says:

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

  • Eloi says:

    1 1

  • Zovc says:

    mysql_query("SET NAMES 'utf8'");

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

  • nicolacho says:

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

  • Lolo says:

    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..

  • Jorge says:

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

    mysql_query(“SET NAMES ‘utf8′”);

    Eres grande.

  • gabriel says:

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

  • Benji says:

    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

  • Xavi Author says:

    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 :)

  • Valeria says:

    Hola,

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

  • Luis Macias says:

    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!

  • Sino says:

    Muchísimas gracias!! es lo que buscaba.

  • javier campuzano says:

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

  • Jose Collazos says:

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

    Gracias

  • Patricio Lillo says:

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

  • Fatima says:

    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

  • Nicole says:

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

  • Briones says:

    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′);

  • leandro d m says:

    me sirvio el paso 4 ! gracias

  • DragonRojoHispano says:

    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.

  • dukanista says:

    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.

  • Xavi Author says:

    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!

  • MarBcn says:

    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.

  • Xavi Author says:

    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.

  • Miguel says:

    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.

  • Xavi Author says:

    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 :)

  • David says:

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

  • David says:

    El punto 4 funcionó para mi. Gracias!

  • @ucraman says:

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

  • Map says:

    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!

  • Jesus says:

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

    de nuevo muchaaaaaaaaaaaaas gracias

  • LoThaR says:

    Capo!!

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

  • Alvaro says:

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

  • niux says:

    Gracias Xavi,

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

  • julio balderas says:

    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.

  • Eduardo Ferrón says:

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

  • Carlos66 says:

    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.

  • John says:

    Me has salvado la vida! Gracias! Bendiciones!

  • Andres says:

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

    Gracias.

  • Ernesto says:

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

  • Ana says:

    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

  • Santiago says:

    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

  • Johez says:

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

  • Arfio says:

    como a todos el paso 4 fue la solucion.

    Gracias. un buen aporte.

  • EditionXav says:

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

  • Luis Miguel says:

    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

  • jajlil says:

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

  • migovilo says:

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

  • Diego says:

    Eres lo máx. thanks

  • Cristian says:

    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 “”;
    ?>

  • Matias says:

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

  • Daniel says:

    Muchas gracias. Me ha servido bastante

  • Alberto says:

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

  • Rubroch says:

    Eres un genio mi estimado. Muchas gracias !!!

  • Rubroch says:

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

  • adiazq says:

    Excelente, me sirvio el paso 4!

  • Frank Molina says:

    Excelente, me resolvió el paso 4, suficiente
    Gracias

  • occiso says:

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

    =D

  • ship says:

    guena me salvaste

  • Luinux says:

    Muchas gracias, funciona perfecto!!

  • Ariel Maluenda says:

    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!

  • chemo says:

    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

  • Juls says:

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

  • Leandro says:

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

  • Jose Angel says:

    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.

  • kote says:

    Genial, funcionó a la perfección.

  • max says:

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

  • kralf87 says:

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

  • Heli says:

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

  • Rafael says:

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

  • ad-hok says:

    wena onda, el paso 4 es la salvacion :D

  • joshua says:

    muy bien!

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

  • Erick says:

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

  • kira says:

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

  • Andres Felipe says:

    Gracias me funcionó muy bien.

  • Rafael Azuaje says:

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

  • Rex says:

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

  • Davan Palma says:

    Pequeñas grandes soluciones.

  • Paty says:

    Me sirvio el punto 4.

    Muchas Gracias¡ =)

  • Andres says:

    Muchas gracias excelente tutorial me han salvado la vida

  • vadrianac says:

    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!!!

  • Ezhaym N says:

    El paso 4 es una joya! gracias!

  • Joseph says:

    Muchas Gracias, me salvaste de buenos dolores de cabeza!

  • Gerson G. BJ says:

    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.

  • Gidrek says:

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

  • rpd says:

    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!

  • Neiris says:

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

  • Tory says:

    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.

  • Frilex says:

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

  • Silvio says:

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

  • Pablo says:

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

  • Rodolfo says:

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

  • BJ_BlackCat says:

    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.

  • pacomer says:

    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

  • ESPE says:

    Hola Xavi.
    Tengo una (entre otras) duda.
    Quiero enviar un e-mail con una ficha html, pero que no esté adjunta, sino que este incrustada en el e-mail. Trabajo con el servidor 1&1, pero como no domino demasiado el tema, no consigo hacerlo. Que puede que tampoco se pueda, no? Espero que esto me lo puedas contestar tambien.
    Por otro lado, como lo único que puedo hacer es adjuntar el archivo al e-mail, el título que ve la gente que lo recibe es “Marketing%20Deportivo[1].html”. No creo que sea un nombre de un archivo que atraiga a abrir. Por eso queria preguntar-te como hago para que aparezca ” Marketing deportivo” sin ningun signo raro?
    Moltes gràcies.

  • Xavi Author says:

    Hola Esperanza,

    Para enviar un email con formato HTML tienes que usar este codigo PHP (cambia los parametros por los tuyos):

    $to = "From: Xavi <[email protected]>\r\n";
    $subject = "Marketing deportivo";
    $html = "codigo html aqui";
    $headers = "From: Esperanza <[email protected]>\r\n";
    $headers .= "Reply-To: [email protected]\r\n";
    $headers .= "MIME-Version: 1.0\r\n";
    $headers .= "Content-Type: text/html; charset=UTF-8\r\n";
    mail($to, $subject, $html, $headers);

    Saludos,
    Xavi

  • ESPE says:

    muchas gracias xavi, y gracias por tu rapidez!
    saludos,
    espe

  • jose says:

    Hola, quería darte las gracias, me ha servido de mucho. La verdad es que era un problemón.

    Saludos :)

  • eldher says:

    En Notepad++ asegurense de guardar sus .php y .html en UTF-8, evita muchos dolores de cabeza

  • Nicolas says:

    Gracias loco me salvaste con el paso 4…

  • jose says:

    Gracias, gracias. Estoy haciendo una cosa con python y php -éste no lo domino- y tras intentarlo todo con python me entró la sospecha por el php… tu blog y el bendito paso 4 han sido mano de santo

  • Pablo says:

    Excelente gracias por el post.! me sirvio bastante…

  • Gonzalo says:

    Gracias me sirvió como a los demás la opción 4.. sufrí un poco pero pude después se los agradezco

  • Salvador says:

    A mi también me valió el paso 4, muchas gracias!!

  • oviedo says:

    me uno a la lista de agradecimientos, buen trabajo!

  • Circe says:

    1000 gracias. Paso 4 mi salvación.

  • Eduardo says:

    Hice todo lo anterior y nada me sirvió hasta tomé el TextEdit (Bloc de notas en Windows) y salvé mi PHP como “archivo.php” con Codificación Unicode (UTF-8)

  • Carlos Hernandez says:

    Muchas gracias en serio, sirvió demasiado. Excelente post.

  • J. Alfonso says:

    Saludos Xavi.
    El problema que tenia era que al sacar un listado y convertir a minúsculas las cadenas (en la base de datos las cadena almacenadas en mayúsculas y sin problemas con los acentos y ñs), los caracteres acentuados y las ñs no se transformaban.

    Después de realizar todos los pasos, (excepto en el servidor apache), y no solucionar el problema, seguí buscando y encontré una solución, quizás no sea del todo correcta, pero funciona y es utilizar la función mb_strtolower de PHP.

    La utilice de esta manera:
    $clave = utf8_encode($clave);
    $clave = mb_strtolower( $clave,”UTF-8″);
    $clave = ucwords($clave);

  • Gabriela says:

    Muchísimas gracias. Me has salvado (igual que a muchos otros por lo que veo) de un rato de desesperación. El paso 2 fue el que me lo solucionó al momento. ¡Buenísimo artículo! :D

  • christian says:

    Muchas gracias amigo en serio me sirvió de mucho

  • JCB says:

    Tio, eres el mejor, me has solucionado la vida

  • PEdro says:

    muchas gracias..el paso 4 me faltaba.
    muchas gracias de verdad ;)

  • arielmacintosh(3) says:

    la opción 4 fue la solución, Gracias :)

  • Omar García says:

    Muchas gracias por los datos, a mí me sirvio el punto cuatro:

    mysql_query(“SET NAMES utf8″);

  • mariel says:

    hola no puedo hacer que desde mi base de datos se me muestren los datos correctamente,con acentos y ñ .la bd esta hecha con mysql Cotejamiento utf8_spanish_ci .este es mi código espero alguien me pueda ayudar.

    <?php
    $dp=mysql_connect("localhost","root", "");
    mysql_select_db("sisemm",$dp);
    $sql =("SELECT nomObra'Nombre de la obra',descrip'Descripción',direccion'Dirección',colonia 'Colonia',comunidad'Comunidad',estado 'Edo de la obra',
    finicio'Fecha Inicio',ffin'Fecha Fin',beneficiados'Personas Beneficiadas',inversion'Inversión',tipoRecurso
    'Recurso',responsable'Responsable',nomEje'Eje'

    FROM obras,zonas,ejes
    WHERE finicio BETWEEN '2009-01-01' AND '2009-12-31'
    AND obras.idZona=zonas.idZona AND ejes.idEje=obras.idEje ORDER BY nomEje ") ;

    $resultado=mysql_query($sql);
    $campos=mysql_num_fields($resultado);
    $filas=mysql_num_rows($resultado);

    echo 'El número de obras registradas en el 2009 es: '.$filas.'';//obtenemos el numero total de registros por tabla

    echo"\n “;//empezar tabla

    echo””;//crear fila
    for ($i = 0;$i< $campos;$i++){
    $nombrecampo= mysql_field_name($resultado,$i);

    echo"$nombrecampo “;
    }
    echo”\n”;//cerrar fila

    while ($row=mysql_fetch_assoc($resultado)){
    echo””;//crear fila
    foreach ($row as $key=>$value){
    $value=utf8_encode($value);
    echo”$value “;
    }
    echo “\n”;//cerrar fila
    }
    echo “\n”;//cerrar tabla
    mysql_close($dp);

    ?>
    ?>

  • Marco Contreras says:

    no tengo problemas con mostrar, las tildes mi problema es q no los ordena alfabeticamente ejemplo me pone antes todo lo q tenta tilde
    López Ponce, Jose Alejandro
    Ligorría Najera, Arturo,
    se entiende q primero va ligorria, pero no logro ordernarlo gracias..

  • babel says:

    De lujo el paso 4 estaba batallando gracias

  • jfrubio says:

    Mil gracias!!

  • Javier says:

    Gracias a la ayuda de los pasos mencionados he solucionado el bendito problema de las ñ y los acentos entre php y mysql.

    Particularmente el punto 4 fue el que más me sirvió.

    Gracias totales….!!!

  • gustavo k says:

    Gracias.

    Me volví loco para descubrir por que me aparecían las eñes y los acentos como letras “a” con fondo de color, y era porque estaba haciendo utf8_encode a un string que ya era utf8.

    saludos

  • Fernando says:

    Ya lo resolví: Recordad codificar todos los archivos de la pagina en UTF-8

  • Patxy says:

    Muy bueno, el paso 3 me salvó. Muchas gracias!

  • Pablo says:

    LA ROMPISTE MAN, ME SALVASTE LA RETAGUARDIA POR NO DECIR EL CU….
    SIN PALABRAS AMIGOOOOO

  • Dr. Freedom says:

    Saludos. Me funcionó bien el paso 4. Gracias por el aporte.

  • IObed Gómez says:

    La opción 4 funciona muy bien, Gracias.

  • CDWL says:

    pense k conla opcion 4 iba a solucionar el prblema..pero no me funciono…yo inserto datos a mi tabla (el cotejamiento de mis tablas es utf8_spanish_ci)…luego pongo lo k mysql_query(“SET NAMES ‘utf8′”); y igual el la BD los caracteres con acentos se iregistrar mal (ó)

  • donjuan says:

    gracias compadre funciono perfectamente
    saludos

  • petiso says:

    me funciono bien la tecnica del
    header(“Content-Type: text/html;charset=utf-8″);
    en el script php que contiene la funcion que uso para tocar la base de datos, uso mysqli. supongo que dependerá mucho del servidor que tengamos contratado, me apunto el resto de metodos gracias por el post

  • Miguel says:

    De mucha utilidad, breve y directa solución.
    Muchas gracias.

    ;D saludos!

  • wladimir says:

    excelente , hice todo lo indicado hasta el punto 4 mysql_query(“SET NAMES ‘utf8′”); y me funciono perfecto,
    gracias

  • leo says:

    Solo con el 4 ya me va, gracias!!!

  • Miguel says:

    Muchas gracias por el código, estoy empezando en programación y me sirve bastante..
    la clave es colocarle el meta tag dentro del head
    y luego hacer el llamado a la librería con set names (cambiar nombres) de acuerdo a la colación utf8, que hace que el navegador al leer este código cambie su formato usando la colación utf8…simple y grandioso..gracias

  • Sebastian says:

    El paso 4 me sirvio de maravilla, muchas gracias.
    Si se puede y vale la aclaración en caso de que usen mysqli OO:
    Despues de crear el objeto:
    $mysqli = new mysqli(//Aca van los parametros);
    Aplican la query:
    $mysqli->query(“SET NAMES ‘utf8′”);
    Y luego pueden hacer su trabajo con el MySql.

    Saludos

  • Fox Mulder says:

    Excelente post. Tenia problemas cuando pase la aplicacion al servidor, con este post pude resolver la situación. Gracias por esta contribucion.

  • Luis Acevedo says:

    Solucionado
    Andaba buscando una solución técnica, excelente aporte
    Gracias

  • Diego says:

    Muchas gracias!!!!!!!!!!! El paso 4 fue la solución!!!!!

  • Tania says:

    Debes estar acostumbrado ya de las gracias pero me sumo, GRACIAS!!!! la solución 4 me ayudó

  • Info says:

    Heyyy muchas gracias…

  • Zipus says:

    Ingresa el texto que deseas corregir aquí.Probé todos los pasos y no funcionaba nada… buscando encontré una cosa que no me cuadraba y funciono.

    Lo único que cambie fue:
    header(“Content-Type: text/html;charset=utf-8″);
    por:
    header(“Content-Type: text/html;charset:utf-8″);

    Al momento se fueron todos mis problemas, mil gracias!
    Espero que a alguien le sirva. Saludos

  • frank says:

    solo modifica esto en la etiqueta meta:

    fijate en el charset=iso-8859-1 y solucionado el problema de las tildes :

  • Juan says:

    Hice solo lo que propuso frank :
    “fijate en el charset=iso-8859-1″ en la etiqueta meta y ahora me salen los caracteres con normalidad.
    Gracias por compartir sus soluciones!!!.

  • Edison says:

    Excelente!! Funciono de maravillas el paso numero 4.

  • fritz says:

    muy buenaso, muchas gracias fue de gran ayuda

  • Kamilon says:

    El paso 4 definitivamente es la solución…………
    Gracias!
    SL2!

  • Armendyss says:

    Excelente solo me faltaba mysql_query(“SET NAMES ‘utf8′”); ok muy bueno. Gracias.!!!

  • Sergio Hurtado says:

    Gracias, el mejor post en este tema, seguro que se soluciona el problema, lo logré con el paso 4. Muchas gracias desde Colombia..

  • RicardoG says:

    EL paso 4 lo soluciona de inmediato ¡¡¡¡ EXCELENTE muchas gracias desde Chile.

  • Joni Noguera says:

    al fin un consejo completo que soluciona el problema, muchas gracias

  • Law says:

    mysql_query(“SET NAMES ‘utf8′”);

    con eso lo resolvi…muchas gracias!

  • willian says:

    Gracias..espero tambien me serva al momento de inserciones
    solo use el paso 3: $acentos = $con->query("SET NAMES 'utf8'");

  • gilberto says:

    hola tengo un problema todo bien con los pasos y guarda los acento y las ñ en la base de datos solo que al desplegar me aparecen unos signos ? agradezco me puedas ayudar Gracias

  • andres says:

    gracias!!!!

  • Luke says:

    Muchisimas gracias. El paso 4…el que me arregló el tema. Mil gracias!

  • Jorge says:

    Muchas gracias, siguiendo los pasos hasta el 4 funciona perfecto
    Gracias

  • ISaac says:

    mysql_query(“SET NAMES ‘utf8′”)

    Esto donde hay que ponerlo?? :S

  • Javier Herrera says:

    Gracias!! funciono :D
    mysql_query(“SET NAMES ‘utf8′”);
    para quienes no entienden donde se pone, lo debes poner despues de que abres la conexión con mysql.
    :D

  • tazcre says:

    Excelente solución, gracias!

  • Jose says:

    GRACIAS

  • Héctor says:

    Muchas gracias.
    $db->query("SET NAMES 'utf8'"); es la clave también para ZEND framework

    Saludos!

  • Pedro Enrique Bravo says:

    Buen aporte hermano, en ese orden funciona como debe ser:

    sql_connect($dbhost, $dbuname, $dbpass, $dbname);
    mysql_query(“SET NAMES ‘utf8′”);

  • Adri says:

    Gracias, solamente con colocar el paso 4 funcionó.

  • Yo Mero says:

    Perfecto!! muchas gracias, saludos desde MX

  • maq says:

    Me funcionon la 5ta!

    gracias por el aporte!

  • maqay says:

    Felicitaciones x tu articulo..
    pd: casi nunca lo hago.. pero lo hiciste muy bien.. a mi me sirvio el 4to.

  • Yonatan Eric says:

    Excelente brody tengo el wamp server con windows7, seguí los pasos solo me faltaba agregar el mysql_query(“SET NAMES ‘utf8′”); lo cual abri mi archivo php de la conexión (o donde se haga la conexión a la bd) y le agregue la línea para quedar como sigue:

  • Martin says:

    Muchas gracias realmente me sirvio mucho. Soy de programar sobre plataformas de Microsoft y generalmente estos problemas no hay. Pero con MySql soy novato
    Lo tuyo fue un post contundente y al grano del problema hay muy pocos generalmente no se encuentra esta clase de soluciones en la web. Gracias nuevamente y a tus servicios si necesitas algo.

  • rosana says:

    perfecto!!! gracias

  • Yo says:

    Perfecto, el unico método que me ha funcionado :), mil gracias

  • Melaine says:

    Hmm is anyone else experiencing problems with the pictures on this blog loading?
    I’m trying to figure out if its a problem on my end or if it’s the blog.
    Any suggestions would be greatly appreciated.

    click the following document
    and Click Here
    and click the following website
    and also Click On this website

  • Alfok says:

    The 4th option work for me, Thank you!!

  • Dario Olivares says:

    Muchas Gracias!!!! Muy útil :D

  • Antonio says:

    Muchas gracias, decir que con mysqli por procedimientos el paso 4 lo he aplicado de la siguiente forma:
    mysqli_set_charset($enlace, 'utf8');

  • Liseth says:

    Hola Xavi, excelente aporte! Nos has salvado a muchos con esto :) Y debo comentarte que también sirve aplicándolo a Java, la única diferencia es el manejo de funciones para la inserción de datos, en este caso (con Java) solamente se sutituye el:
    mysql_query("SET NAMES 'utf8'");
    por:
    objetoStatement.executeQuery("SET NAMES 'utf8'");
    Saludos y nuevamente gracias!

  • Jorge says:

    Lo del SET NAMES me ha salvado la vida… QUE DIOS TE BENDIGA, XAVI ESTEVE!!! :*

  • Jaime says:

    De verdad que muchas gracias. Hay demasiadas páginas por ahí que sólo revuelven a uno. Aquí no hay pierde.

    Gracias :-D

  • Vicen says:

    Muchas gracias, esto si que es un buen post y no como otros que te ponen una solución que nunca es la buena y se quedan tan anchos.

    Lo que me ha servido a mi, ha sido cambiar la configuración del “cotejamiento de las tablas” de UTF8_spanish_ci a UTF8_unicode_ci.

    Saludos y gracias de nuevo

  • Fer says:

    ¡Muchas gracias hermano!. Muy útil tu aporte, muy claro todo. Años atrás, hice páginas “.htm” y “.php”, con Charset:windows-1252, con FrontPage, por comodidades de buscar-remplazar códigos, etc. MySQL, phpMyAdmin, y Apache (ensayando en local en mi PC). Subí mis páginas el servidor, y funcionaba todo bien, el phpMyAdmin del host, tiene cotejdo DB en UTF-8_general_ci, Tablas: UTF-8_general_ci, y campos en: latin1_general_ci. Al renovar en mi PC, el Apache, PHP, MySQL, phpMyADmin, a versiones nuevas, son un poco más avanzadas que las del Host, empecé a tener problemas. MySQL 5.0.86-community-nt, config. en UTF8. Exporté desde el web, la DB vieja en SQl x phpMyAdmin,
    los datos en páginas viejas con Charset:windows-1252, se veían bien, más las nuevas que estoy creando no sucede así. Si modifico sus códigos en “block de notas”, como lo hice siempre, me da una cosa, y si las modifico en FrontPage, es otra. No quiero cambiar el Charset:windows-1252 a todo el sitio, no quiero meter la pata. Pero ya no es tan fácil actualizar mi sitio con estas nuevas versiones de PHP, MySQL, etc, o he configurado mal. Al querer acceder x línea de comandos a MySQL, no puedo hacer una búsqueda con acentos. Al hacer un “SELECT * FROM t”, me muestra símbolos extraños, no sé cómo mejor configurar para el futuro, si depurar todo acento, apóstrofes, etc, en los formularios de ingreso, y que vayan a MySQL “limpios”, pero para el caso de diccionarios indígenas, no podría hacer esto. De todas formas estoy muy agradecido y contento de que existan personas de “corazón open source”.
    Saludos de Sud-América.

  • Angel says:

    Muchas gracias… era lo unico que me faltaba, aplique la 4ta y esa fue la que funciono :p

  • online beats maker says:

    I’m amazed, I must say. Rarely do I come across a blog that’s equally educative and
    engaging, and without a doubt, you have hit the nail on the head.
    The issue is something that not enough people are speaking intelligently about.
    I’m very happy that I stumbled across this in my hunt for something concerning this.

  • Luis says:

    Gracias hermano, me ha servido de mucho

  • NG says:

    ¡That’s good!.. Excellent.
    4 RULEZ.!

  • Luciano says:

    Hola:
    Casi todos los pasos ya los tenía hechos antes de llegar aquí, y desde la web me funciona perfectamente.
    El problema lo tengo cuando inserto o modifico un registro a mano desde phpMyAdmin, ahí me graba ? en lugar del acento.
    Pero copiando la consulta que genera phpMyAdmin y ejecutándola desde la web me lo graba bien.
    ¿Alguna idea de lo que hay que tocar en phpMyAdmin?
    Muchas gracias. Un saludo.

  • Mario says:

    Me solucionaste un gran problema gracias :)

  • Varunga says:

    A pesar de que juntas millones nunca está de más decírtelo de nuevo ¡¡Gracias!! Muchas muchas gracias :) El paso cuatro fue el definitivo.

  • Roberto says:

    Para los usuario de Navicat, un tip que se podría agregar a esto es, en las propiedades de la conexión:

    Encoding es UTF-8, y los dos checkboxes de abajo vacíos

    -roberto

  • VnvJeszyK says:

    Muchas gracias Xavi! Justo lo que necesitaba… =)

  • soter says:

    Muchísimas Gracias !!!!!
    Era lo que estaba buscando hace varios días y no lo podía encontrar !!!!!

  • Oyito says:

    Me funciono el paso 4, nunca dejo comentarios pero valió la pena.
    Gracias

  • HackJoues says:

    Gracias hermano, me estaba desesperando hasta que encontre tu post muy bueno el consejo 4 me funciono de maravilla!! :D Gracias

  • rulo says:

    Muchas gracias ha sido de gran ayuda

  • Wilson Laguna says:

    Hermano muuuuuuuuuuuchas gracias, me salvó de una :) Bendiciones.

  • Rafa says:

    Graaaaaacias! Me estaba volviendo loco!

  • Jonathan says:

    Muchas gracias, sirvió perfectamente.
    Saludos

  • Jose says:

    Gracias solucione el problema que tenia, genial

  • tekilalemon says:

    Gracias! Guardaré este link como oro en paño!

  • victor says:

    excelente aporte… con el paso 4 todo listo!!!! muchas gracias.

  • Fidel Rodríguez Hernández says:

    Gracias, tenia 2 días con el problema intentando resolverlo, a mi me ayudo esta instrucción.

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

    GRACIAS…

  • luis says:

    Gracias!!
    justo lo q estaba buscando, aunq en mi caso solo fue necesario el punto 4 (y tener definido el utf8 en el head de la pagina obviamente)

  • Angel says:

    Como casi todos,la opción 4 también me funcionó perfectamente, y a la primera.
    Muchas gracias!!!

  • Adrian Sosa says:

    Muchas Gracias me sirvio de mucho.

  • Andres Zuluaga says:

    Excelente la opción 4. Gracias.

  • che luis oaxaca says:

    gracias hermano me salvaste de una…

  • Juan Gutiérrez says:

    EL PASO 4 LA lleva..!!!
    no tienes que hacer nada más que mandarlo después de la conexión….
    Eres una máquina Bro.:!!
    De CHILE gracias.!!!

  • Carlos Guerrero says:

    ¡Genial! Me solucionaste un gran problema.
    Muchas gracias por el post que algunos años después, sigue siendo muy actual.
    Saludos desde México.

  • Luis de Leon says:

    Me funciono el paso 4. lo puse de esta forma y ya pude solucionar mi problema:
    mysql_query($conexion, “SET NAMES ‘utf8′”);

  • Noemi says:

    Muchas gracias por la aportación me sirvió mucho

  • kevin says:

    aaaaa me gusto muhco gracias es lo que necesitaba

  • Gilbert says:

    Gracias!!! el 2-3-4 corrigieron mi problema *-*

  • Daniel says:

    Excelente! He solucionado el problema gracias a estas directrices.

  • Juan Ortiz Ordoñez says:

    Gracias. Me ha salvado el día con esta guía de resolución de acentos diácritos y eñes en PHP+MySQL.

    Saludos.

  • Ayose says:

    Gracias, Gracias ,Gracias por compartir esto con novatos como yo.

    S2.

  • Eder says:

    ¡Excelente! Hasta el paso 4 fue suficiente. ¡Muchísimas gracias brother!

  • Joseman says:

    Muchas gracias, me funcionó todo muy bien, ya no me selen los signos de interrogación. Saludos

  • Manuel says:

    Hola Xavi e invitados.
    No controlo casi nada de php y Msql.
    Necesito vuestra ayuda para saber que solución darle a este problema:

    He actualizado la versión php de un servidor ( arsys) de la versión 5.1.6 a 5.4.4. Os podeis imaginar la cantidad de deprecates que me ha dado.
    Lo que ocurre ahora es que cuanquier registro de la base de datos mslq que contenga algún caracter como tildes, ñ etc… directamente no aparece. Es decir, si hay un registro en la base con una frase como ” yo tengo un camión” cuando visualizo la web no aparece nada ( blanca la frase entera).
    Datos:
    Cotejamiento base de datos utf8_unicode
    Tablas: latin1_spanish.ci
    Los archivos php de la web tienen defibido el charset en iso-8859-1

    No se que puede ser, no tengo ni idea. Los registros dentro de la base de datos están bien y tienen sus tildes, ñs, etc…

    Si piudioerais orientarme al menos.

    Muchas gracias.

  • Enrique says:

    Después de tantas batalla (ganadas, eso sí) contra el tema, resulta que descubro (me descubres) el punto 4… ese punto es mejor que el punto G, compañero. Un abrazo, y mis más sinceras GRACIAS.

  • Manuel says:

    Muchas gracias, llevaba dos días volviéndome loco con este tema, y por fin me ha funcionado

    Graciaaaas =)

  • DEMIAN says:

    gracias me funcion la 4ta opcion facil y aplica en todo

  • Valentin says:

    si bien toda la informacion es muy interesante, el punto 4 soluciono mi vida

    Gracias y saludos

  • pukis says:

    Quiero darle las gracias, segui paso a paso su manual y cuando llegue al punto 4, uaala funcionó perfectamente y pude solucionar el problema que tenía con los datos traídos de mysql a php.

    felicitaciones muy buena ayuda y nos ha ayudado a muchos

    Gracias hermano
    hasta pronto

  • panolismaximus says:

    Para “mysqli” en modo procedural es necesario especificar la conexión

    $conexion = mysqli_connect($host,$user,$pass,$name);
    mysqli_query($conexion,"SET NAMES 'utf8'");
  • José says:

    Excelente aportación.

  • elkin says:

    Muy bueno!!!!

    estoy de acuerdo con todos el punto 4 funciono.

    Gracias….

  • Pedro Luis says:

    Mil Gracias Xavi. No se puede resolver más problemas con menos líneas. La aportación del SET NAMES ‘utf-8′ simplemente GENIAL.
    Funciona a las mil maravillas incluso con JQUERY MOBILE…

  • oscar says:

    Sin duda la solución:

    mysql_query("SET NAMES 'utf8'");

  • Alf says:

    do forever
    say "Gracias"
    end

  • Ricardo says:

    Muchas Gracias:
    Seguí tu consejo y pude solucionar el problema que tenia a mostrar los resultados de una consulta en MySQL.
    Exitos

  • Jes sannin says:

    Me había rendido al no funcionarme nada y llege acá y buala magia muchas gracias colega excelente trabajo opción 4 rulz

  • Rocío Ramírez says:

    Saludos!!, mi problema es similar, el detalle es que al generar un archivo pdf las palabras asentadas en o,e,u y ñ se muestran así “??” y en un archivo en HTML se muestran bien todas las palabras pero en el pdf no. Ojala y me puedan ayudar, me sería de mucha ayuda.Gracias

  • benjhi says:

    genial el step 3,me funciono

  • Ricardo says:

    Mil gracias Fernando, esto me ha robado un montón de tiempo hasta que dí con tu artículo. El punto 4:

    mysql_query("SET NAMES 'utf8'");

    ha sido el que ha solucionado mi problema y no lo he visto en ningún otro foro.

  • Daniel says:

    Gracias!!!
    Muy bueno, el paso 4 definitivamente!!!!

  • juan carlos says:

    gracias amigo me sirvio de mucho

  • Jorge quirino says:

    Excelente compadre, estube un par de hr solucionandolo y con un par de pasos quedo listo..

    Gracias !!!

  • Gabriel says:

    muy bueno “SET NAMES 'utf8'” , que pasa si la pagina es multidioma, y el texto ingresado puede estar en alemán o frances… funcionará igual???

  • Sero says:

    Me sirvió de mucho. funcionó a la primera

  • Claudio says:

    Muchas gracias. Muy buen aporte. Siempre tengo este problema de encoding/charset cuando inicio un proyecto desde cero. Finalmente el que terminó sirviendo en mi caso fue “SET NAMES ‘utf8′”.
    Respondiendo a GABRIEL: Sí, te servirá porque el charset UTF8 incluye caracteres especiales como la cerilla francesa y los acentos y diéresis de múltiples idiomas como el alemán y francés. Incluso podrías pasarlo a ruso con caracteres cirílicos. Ahora no creo que sea tan fácil con los caracteres orientales como el chino o tai.

  • Ajax says:

    hey amigo! eres lo maximo! me salvo la vida el SET NAMES 'utf8'. Gracias por tu enorme aporte, ya tienes ganado el cielo jeje

  • Epale says:

    Gracias funcionó.

  • tyrone says:

    Muchisimas gracias. No pudiera sido explicado mejor. Tan facil.

  • Horacio says:

    Mil gracias !!!

  • muy_cansado says:

    Gracias!!! Funciona de maravillas!! Salvaste a este semi-novato de php.

    Un saludo.

  • jeremias says:

    gracias por la ayudadita tenia el error en un guion ‘utf-8′ asi lo tenia,jeje erres, ahora el problema es que las tildes y la ñ en mayuscula me la coloca en miniscula, lo que pasa que le pase un strtouper pero cuando coloco la tilde o la ñ me lo deja en minuscula,
    alguna sugerencia

  • Guillermo Malagón says:

    Muchas más facíl convertir en la base de datos esos simbolos a tildes!!!

    SELECT convert(cast(convert(content using latin1) as binary) using utf8) AS content

  • Xavi Author says:

    Gracias Guillermo! He añadido tu solución

  • ricardo says:

    Buenas, estoy utilizando prestashop y no consigo encontrar el archivo desde donde se le hace la llamada a la base de datos.
    No sé si me podrán ayudar.
    Un saludo.

  • ricardo says:

    Hola de nuevo, he encontrado la conexión a la base de datos, pero no se exactamente donde tengo que insertar el código mysql_query(“SET NAMES utf8″);
    Dejo el código que tengo y si alguien me puede indicar, estaría muy agradecido.
    Un saludo.

    class MySQLCore extends Db
    {
    /**
    * @see DbCore::connect()
    */
    public function connect()
    {
    if (!defined(‘_PS_MYSQL_REAL_ESCAPE_STRING_’))
    define(‘_PS_MYSQL_REAL_ESCAPE_STRING_’, function_exists(‘mysql_real_escape_string’));

    if (!$this->link = mysql_connect($this->server, $this->user, $this->password))
    throw new PrestaShopDatabaseException(Tools::displayError(‘Link to database cannot be established.’));

    if (!$this->set_db($this->database))
    throw new PrestaShopDatabaseException(Tools::displayError(‘The database selection cannot be made.’));

    // UTF-8 support
    if (!mysql_query(‘SET NAMES \’utf8\”, $this->link))
    throw new PrestaShopDatabaseException(Tools::displayError(‘PrestaShop Fatal error: no utf-8 support. Please check your server configuration.’));

    return $this->link;
    }

    public static function createDatabase($host, $user, $password, $dbname, $dropit = false)
    {
    $link = mysql_connect($host, $user, $password);
    $success = mysql_query(‘CREATE DATABASE `’.str_replace(‘`’, ‘\\`’, $dbname).’`’, $link);
    if ($dropit && (mysql_query(‘DROP DATABASE `’.str_replace(‘`’, ‘\\`’, $dbname).’`’, $link) !== false))
    return true;
    return $success;

    }

    /**
    * @see DbCore::disconnect()
    */
    public function disconnect()
    {
    mysql_close($this->link);
    }

    /**
    * @see DbCore::_query()
    */
    protected function _query($sql)
    {
    return mysql_query($sql, $this->link);
    }

    /**
    * @see DbCore::nextRow()
    */
    public function nextRow($result = false)
    {
    $return = false;
    if(is_resource($result) && $result)
    $return = mysql_fetch_assoc($result);
    elseif(is_resource($this->_result) && $this->_result)
    $return = mysql_fetch_assoc($this->_result);
    return $return;
    }

    /**
    * @see DbCore::_numRows()
    */
    protected function _numRows($result)
    {
    return mysql_num_rows($result);
    }

    /**
    * @see DbCore::Insert_ID()
    */
    public function Insert_ID()
    {
    return mysql_insert_id($this->link);
    }

    /**
    * @see DbCore::Affected_Rows()
    */
    public function Affected_Rows()
    {
    return mysql_affected_rows($this->link);
    }

    /**
    * @see DbCore::getMsgError()
    */
    public function getMsgError($query = false)
    {
    return mysql_error($this->link);
    }

    /**
    * @see DbCore::getNumberError()
    */
    public function getNumberError()
    {
    return mysql_errno($this->link);
    }

    /**
    * @see DbCore::getVersion()
    */
    public function getVersion()
    {
    return mysql_get_server_info($this->link);
    }

    /**
    * @see DbCore::_escape()
    */
    public function _escape($str)
    {
    return _PS_MYSQL_REAL_ESCAPE_STRING_ ? mysql_real_escape_string($str, $this->link) : addslashes($str);
    }

    /**
    * @see DbCore::set_db()
    */
    public function set_db($db_name)
    {
    return mysql_select_db($db_name, $this->link);
    }

    /**
    * @see Db::hasTableWithSamePrefix()
    */
    public static function hasTableWithSamePrefix($server, $user, $pwd, $db, $prefix)
    {
    if (!$link = @mysql_connect($server, $user, $pwd, true))
    return false;
    if (!@mysql_select_db($db, $link))
    return false;

    $sql = ‘SHOW TABLES LIKE \”.$prefix.’%\”;
    $result = mysql_query($sql);
    return (bool)@mysql_fetch_assoc($result);
    }

    /**
    * @see Db::checkConnection()
    */
    public static function tryToConnect($server, $user, $pwd, $db, $newDbLink = true, $engine = null, $timeout = 5)
    {
    ini_set(‘mysql.connect_timeout’, $timeout);
    if (!$link = @mysql_connect($server, $user, $pwd, $newDbLink))
    return 1;
    if (!@mysql_select_db($db, $link))
    return 2;
    @mysql_close($link);
    return 0;
    }

    public function getBestEngine()
    {
    $value = ‘InnoDB';

    $sql = ‘SHOW VARIABLES WHERE Variable_name = \’have_innodb\”;
    $result = mysql_query($sql);
    if (!$result)
    $value = ‘MyISAM';
    $row = mysql_fetch_assoc($result);
    if (!$row || strtolower($row['Value']) != ‘yes’)
    $value = ‘MyISAM';

    /* MySQL >= 5.6 */
    $sql = ‘SHOW ENGINES';
    $result = mysql_query($sql);
    while ($row = mysql_fetch_assoc($result))
    if ($row['Engine'] == ‘InnoDB’)
    {
    if (in_array($row['Support'], array(‘DEFAULT’, ‘YES’)))
    $value = ‘InnoDB';
    break;
    }
    return $value;
    }

    public static function checkCreatePrivilege($server, $user, $pwd, $db, $prefix, $engine = null)
    {
    ini_set(‘mysql.connect_timeout’, 5);
    if (!$link = @mysql_connect($server, $user, $pwd, true))
    return false;
    if (!@mysql_select_db($db, $link))
    return false;

    $sql = ‘
    CREATE TABLE `’.$prefix.’test` (
    `test` tinyint(1) unsigned NOT NULL
    ) ENGINE=MyISAM';

    $result = mysql_query($sql, $link);

    if (!$result)
    return mysql_error($link);

    mysql_query(‘DROP TABLE `’.$prefix.’test`’, $link);
    return true;
    }

    /**
    * @see Db::checkEncoding()
    */
    static public function tryUTF8($server, $user, $pwd)
    {
    $link = @mysql_connect($server, $user, $pwd);
    if (!mysql_query(‘SET NAMES \’utf8\”, $link))
    $ret = false;
    else
    $ret = true;
    @mysql_close($link);
    return $ret;

    }
    }

  • David Galian says:

    De maravillas, muchas gracias por la informacion. Saludos

  • David Galian says:

    De maravillas, muchas gracias por la informacion. Saludos

  • reflexion bitcoin says:

    Es raro ver que alguien se tome la molestia de expresarse tan claramente, muy buen art

  • albercar says:

    Xavi Esteve, 5 años después y todavía ES el MEJOR post respecto a este problema. Ni siquiera en inglés, ni siquiera en http://stackoverflow.com Después de horas, días desperdiciados, al fin resolví mi inconveniente con XAMPP/PHP/MYSQL. Ya te imaginarás lo agradecido que quedo. Éxitos por siempre.

  • kual says:

    ¡Gracias! Un genio, por fin algo funcionó.

  • sportivivi says:

    el header fue lo mio :) thanks

  • Sergio De Los Santos says:

    ¡ Gracias ! Una gran solución que antes no había encontrado.
    Me ha sido de gran utilidad.

What to read next?