🌓

Error con acentos y eÑes en PHP/MySQL (Solucionado) Muchas veces al crear una web con PHP y MySQL, ocurre un problema al introducir y mostrar datos: estos se alteran acabando algunos caracteres en áóñ y cosas parecidas. English version here Cuando me pasa esto suelo empezar a toquetear cosas, cambiar charsets y traducir a ñ o á pero nada funciona. El problema es […]

by
on May 23, 2009
(3 minute read)

Muchas veces al crear una web con PHP y MySQL, ocurre un problema al introducir y mostrar datos: estos se alteran acabando algunos caracteres en áóñ y cosas parecidas.

Simple Cloud Hosting Built for Developers

English version here

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:
    mysqli_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. Decodificar strings en PHP
    Decodificar los strings haciendo uso de utf8_decode. Ejemplo:
    $variable = utf8_decode($variable);
    Esta solución debe ir acompañada del cotejamiento, que debe revisarse tanto a nivel de base de datos como en la propia tabla. (gracias Jesús)
  7. Apache
    Quita el DefaultCharset del Apache o modifícalo
  8. 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.

Para aprender a programar lo mejor es que te compres un libro físico para tenerlo al lado del ordenador a modo de consulta/referencia, te recomiendo sin lugar a dudas Domine PHP y MySQL, es el libro mejor recomendado que desde hace muchos años siempre tengo al alcance cuando programo y el hecho de consultarlo físicamente me ayuda a consolidar y memorizar mucho mejor los conceptos.

Things I’m buying on Amazon this week

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

Free 100% online banking account

💳 Get your free debit Mastercard

452 comments

  • Hermano muchas gracias!!

    El paso 4 fue el que me sirvió.

    Excelente, felicidades por este miniresumen!

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

    Un saludo y gracias de nuevo.

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

  • Excelente, muy buena ayuda a la comunidad de desarrolladores…

    Muchas Gracias.

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

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

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

  • 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

  • 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…

  • 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

  • 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…

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

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

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

    +10 si hubise puntos

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

    Muchas gracias!

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

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

  • 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

  • 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

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

    Saludos muchas gracias loko

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

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

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

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

    }

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

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

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

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

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

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

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

  • 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

  • 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

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

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

  • 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

  • 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

  • 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…

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

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

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

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

  • 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

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

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

  • 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

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

  • mysql_query("SET NAMES 'utf8'");

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

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

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

    mysql_query(“SET NAMES ‘utf8′”);

    Eres grande.

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

  • 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

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

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

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

    Gracias

  • 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

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

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

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

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

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

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

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

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

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

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

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

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

    de nuevo muchaaaaaaaaaaaaas gracias

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

  • Gracias Xavi,

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

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

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

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

    Gracias.

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

  • 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

  • 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

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

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

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

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

    =D

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

  • 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

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

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

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

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

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

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

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

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

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

  • 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

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

  • 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

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

    Saludos :)

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

  • 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

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

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

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

  • 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

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

    mysql_query(“SET NAMES utf8”);

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

    ?>
    ?>

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

  • 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….!!!

  • 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

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

  • 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 (ó)

  • 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

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

  • 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

  • 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

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

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

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

  • 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

  • solo modifica esto en la etiqueta meta:

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

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

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

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

  • 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

  • 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

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

    Saludos!

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

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

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

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

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

  • 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

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

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

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

    Gracias :-D

  • 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

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

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

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

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

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

  • 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

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

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

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

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

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

    GRACIAS…

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

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

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

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

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

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

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

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

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

    Graciaaaas =)

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

    Gracias y saludos

  • 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

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

    $conexion = mysqli_connect($host,$user,$pass,$name);
    mysqli_query($conexion,"SET NAMES 'utf8'");
  • 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…

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

  • 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

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

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

    Gracias !!!

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

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

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

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

    Un saludo.

  • 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

  • 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

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

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

    }
    }

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

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

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

  • Finalmente pude resolver mi problema!! A mí me pasaba que directamente las cadenas de texto se cortaban ni bien aparecía un acento o ñ. El problema se solucionó con el uso de la consulta SET NAMES ‘utf8’. Muy bueno y útil el artículo!! Gracias!

  • Excelente aporte. Despues de horas de buscar solución, el paso 4 me soluciono el problema!

    Gracias desde Venezuela!!!

  • yo pegue este en la página donde me fallaba y funciono
    header(‘Content-Type: text/html; charset=UTF-8’);
    mysql_query(“SET NAMES ‘utf8′”);

  • Gracias!! He solucionado mi problema utilizando la opción 4. Saludos!

  • A mi me funciono a la primera simplemente con esta línea de código (para mysqli):

    mysqli_set_charset($miconexion,”utf8″);

    justo después de la línea de código que establece la conexión, es decir, como en este ejemplo:

  • Me funcionó con el paso 4. Gracias por esta ayuda, no se de qué año es, pero lo importante es que sirve y bien.

  • Gracias por el articulo. En mi caso, el punto 4 es el que me ha llevado a la solución, convirtiendo el código en:

    mysqli_query($db, “SET NAMES ‘utf8′”);

  • Realmente estuve buscando esto un buen rato, primero probe todo lo dicho y nada sirvio.

    Pero despues vi que en el punto 4 estaba poniendo el codigo antes de hacer la conexion a la base de datos (woops).

    Arregle eso y vuala todo listo.

    Genial Gracias!

  • gracias mysql_query(“SET NAMES ‘utf8′”); es genial.

    Que pasa si mi base y mis tablas estan como ‘utf8_spanish_ci’ y no ‘utf_unicode_ci’? debo cambiarlas?

  • ¡Muchas gracias! Me ha sido de mucha utilidad, sin duda un genial aporte.

  • no entiendo los pasos 5,6,7 donde vamos a meter la consulta SELECT convert(cast(convert(content using latin1) as binary) using utf8) AS content? para el paso 5 y para el 6 donde vamos a meter DefaultCharset y para el 7 donde vamos a meter htmlentities();

  • Excelente aporte, sólo un comentario, cuando se envían datos que han sido codificados desde Javascript con encodeURI O encodeURIComponent se debe utilizar desde PHP la siguiente decodificacion:

    $incidente = utf8_decode(rawurldecode($_GET['incidente']));

    esto ya que el comando urldecode no funcionacon utf-8.

    Ojalá a alguien le sirva como a mi. Saludos

  • Muchas gracias por la info, me ha servido perfectamente, al igual que Miguel, llegado al paso de la consulta sql, problema solucionado

  • GRACIAS!!! Enviar la consulta mysql_query(“SET NAMES ‘utf8′”); luego de la conexion me anduvo perfecto!!

  • Igual en Paso 4 mysql_query(“SET NAMES ‘utf8′”); fue mi solución, gracias

  • function Conectarse()
    {
    $servername = “localhost”;
    $username = “TU_USUARIO”;
    $password = “TU_CLAVE”;
    $dbname = “TU_BASE_DE_DATOS”;
    $cn = new mysqli($servername, $username, $password, $dbname);
    if ($cn->connect_error) {
    die(“Connection failed: ” . $cn->connect_error);
    }
    mysqli_set_charset($cn, “utf8”);
    return $cn;
    }

  • Gracias!!! Me sirvio el numero 4, los set names.
    Tendras un tip sobre lo siguiente:
    Estoy exportando datos que estan en mysql con un script php. Lo exporte a texto con tabuladores. Hasta aqui todo bien, ya lo hice, pero tengo problema con uno de los campos, es de texto y guarda informacion como esta:

    <p>Moxa mini puro</p>
    <p>Caja con 200 piezas</p>
    <p>Se utiliza para las agujas de calentamiento</p>
    <p>Solo encajar el mango de la aguja en el agujero y apretar el rollo de la ligera para un ajuste perfecto</p>

    Es la descripcion de un articulo, en el cual saltan lineas con enter, usan viñetas etc.

    Cuando se exporta, cada que encuentra el /p> de cierre, me salta una linea, y yo quiero que en una sola linea me ponga toda la descripcion. Me he quebrado la cabeza pero hasta ahorita nada. Te has topado con algo asi?

    Gracias y Saludos

  • El paso 5 me funcionó así:
    SELECT CONVERT( CAST( CONVERT( columna USING latin1 ) AS
    BINARY )
    USING utf8 ) AS columna FROM tabla

    Muy completo tu artículo, estupendo!! Muchas gracias

  • Hola soy nuevo en esto y con referencia al tema hoy instale wordpress en mi hosting y he tenido problemas con esto de los acentos he visto muchas opciones pero alguien me podria ayudar por ultimo que que pagina php debo copiar los codigos etc urgente por favor.

    Saludos

  • Hola Xavi me podrias ayudar mi problema es al sacar la palabra de la base datos me vienen las ñ con caracteres raros. mi codigo es asi:

    include(“conexion.php”);
    $conex=conectarse();
    $cadena_sql=”SELECT * FROM `miembros` WHERE `cargo` LIKE ‘Gerente’ “;
    $result=mysqli_query($conex,$cadena_sql);
    $registro=mysqli_fetch_object($result);

    y asi imprimo en tabla:
    apellidos;?>
    te recuerdo mi problema solo es que la ñ viene como un simbolo raro

  • Muy buen artículo compañero, el item 4 con PDO sería:

    $db = new PDO(…);
    $db->exec(“set names utf8”);

    Saludos

  • Me haz salvado de horas de investigación y búsqueda en la web, mil gracias Xavi, eres la onda!!!
    La opción 4 fue la que corrigió el error en mi proyecto.

  • hola buenas tardes estoy trabajando en framework yii 2 y no se donde colocar la linea de código para que me sirva los de las tildes y las Ñ.

    la mayoría le funciono la opción 4 en la parte de la base de datos y asi es la mia

    ‘yii\db\Connection’,
    ‘dsn’ => ‘mysql:host=localhost;dbname=reportes’,
    ‘username’ => ‘root’,
    ‘password’ => ”,
    ‘charset’ => ‘utf8’,
    ];

  • Hola mas o menos me sirvio la numero 4 , unicamente que yo manejo la nueva “new mysqli” y la unica forma en que funciono fue asi: $conexion->set_charset(“utf8”);
    Saludos y gracias por todo.

  • muy buen post se ve que hay que revisar varias posibilidades y este pos la enumera y le da una prioridad gracias

  • Hola Muchas gracias… con solo usar la consulta mysql_query(“SET NAMES ‘utf8′”);
    después de la conexión se soluciono todo… prueben primero con eso… Saludos

  • Hola Xavi gracias por tus comentarios! una duda si yo uso un archivo de conexion (db.php) seria asi la construccion?

    connect_error)
    {
    die(“Connection failed: ” . $db->connect_error);
    }
    $acentos = $db->query(“SET NAMES ‘utf8′”);
    ?>

  • Hola….
    Definitivamente a mi no me funciona nada de eso ya lo intente pero no sirve

  • hola, a mi no me pasa eso ya que desde que creo la base de datos le selecciono en el Cotejamiento utf8_general_ci , y hago lo mismo que dicen en el post y ademas me aseguro de guardar todos los archivos con codificación utf-8.

  • Gracias carnal muy buena descripcíon mysql_query(“SET NAMES ‘utf8′”);
    Me ahorraste disgustos Excelente!!!

  • yo usando pdo me salio dejare el codigo por si alguien lo necesita

    pdo = new PDO("mysql:host=$host;dbname=$dbname;", $root, $password);
    $pdo->query("SET NAMES 'utf8';");
    $this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);			
    					        
     }
    catch(Exception $e)
     {
     die($e->getMessage());
    }

    ?>

  • Hola.
    Gracias por la aportación. Yo utilizaba elpaso 2y me ha solucionado el problema añadir los pasos 4 y 7.

  • Pues yo debo ser el más torpe del mundo porque aun siguiendo todos los pasos no lo consigo. En la base de datos se graban bien, con ñ y tildes, pero al recuperar los datos salen los caracteres extraños.

  • Amigo, muchas gracias, me has salvado. Me funcionó el paso 4, ¡muy buen aporte bro!

  • Tks a lot!

    Me ha servido la query mysql_query(“SET NAMES ‘utf8′”);

    Ahora puedo usar eñes y ácéntós :D

  • Hola Lutaj,

    Ahora sólo te queda la parte fácil :)

    1. Comprueba qué codificación tienen los campos en la base de datos (por ejemplo: UTF-8)
    2. En HTML, dentro del tag head añade meta charset="utf-8"
    3. Asegúrate que PHP envía el Content-Type correcto, en PHP añade: header('Content-Type: text/html; charset=utf-8');
    (Los ejemplos son para UTF-8)

    Saludos

  • Antes que nada… Muchas gracias Xavi… Me has ahorrado mucho tiempo de investigación.

    Para los que usamos mysqli sin ser orientado a objetos, agregé la siguiente línea después de la conexión y antes de la consulta:
    mysqli_query($db_conexion, “SET NAMES ‘utf8′”);

  • Hola Xavi:

    Tengo el inconveniente que al guardar desde php a mysql se me cambia los acentos y las ñ a ?.
    Ya probé todas las opciones pero nada que ver :(

  • Con POD cambiar:

    mysql_query("SET NAMES 'utf8'");

    Por

    $conexion->exec("set names utf8");

    Saludos

  • Excelente man, me funciono al 100% la opción 4:

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

  • una pregunta, en que parte se debe poner el punto 4? es en una colsulta en phpmyadmin? (soy nuevo en esto)

  • Mil gracias! Solucioné con lo de
    $acentos = $db->query(“SET NAMES ‘utf8′”);
    Que alivio! Ya quería tirar la pc por la ventana jaja.
    Saludos!

  • Lo estoy haciendo en MVC y PDO, me dio idea de corregirlo. Gracias

     "SET NAMES utf8");
    
            $link = new PDO("mysql:host=localhost;dbname=midb","dos","555555555555",$params);
    
    		return $link;
    
    
    	}
    
    }
  • Jo. No se si besarte o besarte… Muchas gracias. Me soluciono un gran problema que tenía.

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

    un saludo

  • Xavier, te iba a invitar a ese merecido café, ¡pero Paypal quiero otro para él!

  • Genial, tio.
    Gracias pq estas cosas ahorran horas de trabajo frustante y cabreante. Me has solucionado un problemon y estaba a punto de quemarme a lo bonzo

  • Muy bueno el aporte, Xavi.

    Por favor, valora la posibilidad de añadir esta solución que fue la que me sirvió, después de haber aplicado algunas (la 4 y la 5 no me funcionaron) de las indicadas por ti.
    MI SOLUCIÓN: Cuando en nuestro php definimos las variables que almacenan los inputs del formulario debemos de decodificar los strings haciendo uso de utf8_decode. Ejemplo:
    $variable = utf8_decode($variable);
    Esta solución debe ir acompañada de otras que indicas como la del cotejamiento que debe revisarse tanto a nivel de base de datos como en la propia tabla en la que estemos insertando datos.

  • Gracias les dejo el codigo que me resolvió la vida jajaj

    $mysqli = new mysqli('localhost', 'root', '', 'database');
    $consulta = "SELECT ...";
    $acentos = $mysqli->query("SET NAMES 'utf8'");
    $resultado = $mysqli->query($consulta);

  • Hay una forma más de hacerlo, se trata de recorrer cada elementl que viene vía $_POST y reasignar su valor codificado en utf8

    foreach($_POST as $key => $value) {
    $_POST[$key] = utf8_encode ($value);
    }

  • Muchísimas gracias Xavi, estoy adecuando en 2019 un ejercicio de un tutorial de PHP con MySQL (ya obsoleto) y lo pude configurar adaptando la instrucción con tu ayuda.

  • Gracias a todos
    lo consegui con:
    mysqli_set_charset($conexion, “utf8”);

  • Muchas gracias, el paso 4 soluciono mi problema, en el caso de que usen una versión mas antigua de mysql este código me funciono a mi:

    $con = mysql_connect(‘server’,’user’,’pass’);
    mysql_set_charset(‘utf8’, $con);

  • Excelente, para curarme en salud utilicé 1,2,3,4 y 6 en mi código.
    Mejor tener la mayoría afinado.

  • En realidad hace tiempo que me rendí. Puse trampas para quitar acentos y eñes que puedan poner los usuarios y con eso solucioné las cosas.
    Porque no hay algo medio que sirva para todo. O por Mysql, o por Javascript o por Php o por otro lado entrarán los caracteres raros.
    Y es que admitamos, para los gringos que son quienes hacen los lenguajes, no existe el resto del mundo ni ningún otro idioma.

  • hola amigo gracias por su aporte, realmente me funciono el punto 4 con otra sentencia, usted sabe como hacer el punto 4 para consultas preparedas en la lebreria mysqli

  • La #4 sólo me anduvo así:

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

  • Sos un maldito genio!!! mil gracais!! Funciono la solucion 4 (la que esta en chiquitito)

  • HOLA! Gracias por tu aporte, mi problema es que no soy programadora, pero necesito usar una web de mi trabajo que tiene el problema. Cuando yo mando mensajes se ven mal, cuando los mandan otras personas, se ven bien. Como puedo hacer para escribir mensajes y que se vean bien el la web? hay algun truco? Ya sea copiar y pegar desde otro lado! Aclaro que probe esto con OS mac y windows…. No se por que mis companeros de trabajo pueden escribir bien y yo no… Saludos!!!

  • La opción 4 fue la que me sirvio.

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

  • Buenas, en mi localhost si funciona graba bien todo con acentos, pero cuando lo subo al servidor sale con caracteres extraños los acentos. porque se debe que en localhost funciona bien y en server mal?

  • Muchas gracias, años después tu artículo me ha servido para solucionar mi problema con las ñ y acentos, el punto 4 fue la clave. Agradecido.

  • Mil gracias a TODOS!!!! Me puso en la pista esta entrada del blog y algunas respuestas me han acabado de ayudar….

    $acentos = $#tu variable de conecion#->query(“SET NAMES ‘utf8′”);

    lo pongo después de cada query!

    Gracias!!!!

  • Muchas gracias! no puedo creer q sea un post del 2009 y 12 años despues continue resolviendo problemas a la comunidad… exelente!!!

  • Buen resultado Gracias por el codigo:

    $con = mysql_connect(‘server’,’user’,’pass’);
    mysql_set_charset(‘utf8’, $con);

Your email address will not be published. Required fields are marked *

Treasure Chest

Get notified of new projects I make
Usually one email every 3 months

Follow me for cool new products and interesting findings on graphic design, web development, marketing, startups, life and humor.


/*Twitter*/ !function(d,s,id){var js,fjs=d.getElementsByTagName(s)[0];if(!d.getElementById(id)){js=d.createElement(s);js.id=id;js.src="//platform.twitter.com/widgets.js";fjs.parentNode.insertBefore(js,fjs);}}(document,"script","twitter-wjs"); /*Facebook (function(d, s, id) {var js, fjs = d.getElementsByTagName(s)[0];if (d.getElementById(id)) {return;}js = d.createElement(s); js.id = id;js.src = "//connect.facebook.net/en_GB/all.js#xfbml=1&appId=28624667607";fjs.parentNode.insertBefore(js, fjs);}(document, 'script', 'facebook-jssdk'));*/ /*Google+*/ window.___gcfg = {lang: 'en-GB'};(function() {var po = document.createElement('script'); po.type = 'text/javascript'; po.async = true;po.src = 'https://apis.google.com/js/plusone.js';var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(po, s);})();