Convertir caracteres UTF-8 con PHP

  • Por
Funciones PHP para convertir caracteres UTF-8 y que se vean bien los acentos y otras letras del alfabeto latino. Función decode UTF8 PHP.
En ocasiones los textos de la página web pueden contener caracteres raros en lugar de acentos u otras letras propias del idioma español, como la ñ o las letras con diéresis y de otros idiomas latinos. Esto suele ocurrir en casos en que la base de datos trabaje en un juego de caracteres distinto que la página, o que los datos estén mal cargados en la misma. Generalmente estos errores surgen por un tratamiento inadecuado del juego de caracteres UTF-8, que no están procesados como UTF-8, sino como si fueran ISO-8859-1. Con PHP podemos decodificar esos caracteres para que a la hora de mostrar los textos en la página aparezcan correctamente. Para ello existen una funciones que vamos a comentar en este artículo de DesarrolloWeb.com.

Cuando vemos incorrectamente un texto nos pueden aparecer textos como estos:

Solución útil y apañada a UTF-8

Este texto tiene caracteres codificados en UTF8, que debemos decodificar para que aparezcan correctamente los acentos y demás símbolos del alfabeto latino.

Decodificar una cadena UTF-8 con PHP - decode utf8 php

Existe una función de PHP que realiza el trabajo de conversión de los caracteres UTF8 a sus correspondientes códigos reales.

La función se llama utf8_decode() y lo que hace es convertir una cadena que realmente utiliza ISO-8859-1 pero que tiene caracteres codificados a con UTF-8. La conversión genera el string en ISO-8859-1 pero con un sólo byte para todos los caracteres, con lo que se verán correctamente.

Se utiliza así:

utf8_decode("Solución útil y apañada a UTF-8");

Devolverá una cadena el texto correctamente escrito:

Solución útil y apañada a UTF-8

Codificar una cadena al juego de caracteres UTF-8 - encode utf8 php

Existe una función para hacer justo el paso contrario, que vamos a ver también en desarrollo web .com. Es decir, partiendo de una cadena en el juego de caracteres ISO-8859-1, obtener la correspondiente traducción a UTF-8.

Esto lo podemos necesitar, por ejemplo, si nuestra base de datos está definida con UTF-8 y tenemos entrada de datos ISO-8859-1.

El uso es bien simple:

echo utf8_encode("Mañanas de programación PHP");

Y devolverá el correspondiente string convertido a UTF-8, que si lo mostramos en una página que utiliza el juego de caracteres ISO-8859-1, se vería de esta manera:

Mañanas de programación PHP

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

Fernando

02/10/2008
EN JSP TAMBIEN HAY UNA FUNCION COMO LA DE PHP ?

Sergio

04/11/2008
Como hago para aplicar esta función a este fragmento del codigo que viene de tomar los datos de un formulario html:

-------------------------------------------------
Nombre: ".$_POST['nombre']."
Apellido: ".$_POST['apellido']."
Empresa / Institución: ".$_POST['empresa']."
Area y Cargo: ".$_POST['area']."
E-mail: ".$_POST['correo']."
Ciudad: ".$_POST['ciudad']."
País: ".$_POST['pais']."
Teléfono: ".$_POST['telefono']."
------------------------------------------------

Este fragmento lo que hace es tomar los datos de un formulario html y enviarlo por mail. Pero al mail me llegan todos los datos del formulario sin codificar y es muy dificil de leer.
Que puedo hacer?? como aplico esta función?
Desde ya muchas gracias.

Carlos Salas

14/11/2008
Para aplicarlo a un formulario de correo lo que se debe hacer es algo asi:

ejm:
$nombre=$_GET['Nombre'];
...
$msg .= " Nombre: ".utf8_decode($nombre);
...
en el caso anterior como ven, la funcion se aplica en la linea del mensaje. No directamente en la variable que está siendo rescatada del formulario...
en caso de usar campos adiconales fijos (por ejemplo):
$msg .= " N".utf8_decode(ú)."mero de ni".utf8_decode(ñ)."os: ".$niños;
---> en este caso la función se aplica a un texto específico que será enviado conjuntamente con el mensaje, seguido tambien de una variable que no hace uso de la función.

Lo detallaría más pero estoy algo ocupado... si requieren ayuda, pueden escribirme al correo, y cuando pueda; les contesto.

Suerte, espero que les sirva.

Vicente López

08/5/2009
Excelente...
Después de 2 horas busque y busque por fin lo encontré, muchas gracias por el artículo.



Saludos.

ttorrentte

31/8/2009
Gracias Gracias Gracias
Perfecto, llevaba ya un rato enfrascado con lo mismo, no podía hacer consultas con acentos y con esta función se han solucionado, muchas gracias.

Carlos

04/9/2009
Reconocer utf-8
Hola amigos de DW. Aprovechando este tema sobre UTF-8 presento una consulta.
Estoy adaptando un libro de visitas que funciona en Flash, cargando variables desde un archivo php. Es conocido, de flash-db.com
El tema es que no sé cómo ni donde escribir dentro del php el código para que reconozca acentos, ñ y otros caracteres especiales.
A continuación el php en cuestión, y desde ya gracias por su ayuda.

<?php

// If you are using an old version of php, remove the next set of lines.
// or use $HTTP_POST_VARS["..."] instead.

$Submit = $_POST["Submit"];
$Nombre = $_POST["nombreV"];
$Email = $_POST["emailV"];
$Barrio = $_POST["barrioV"];
$Comentario = $_POST["comentarioV"];
$NumLow = $_REQUEST["NumLow"];
$NumHigh = $_REQUEST["NumHigh"];

// Replace special characters - you can remove the next 5 lines if wanted.
$Nombre = ereg_replace("[^A-Za-z0-9 ]", "", $Nombre);
$Email = ereg_replace("[^A-Za-z0-9 @.-/']", "", $Email);
$Comentario = ereg_replace("[^A-Za-z0-9 @.-/]", "", $Comentario);
$Barrio = ereg_replace("http://", "", $Barrio);
$Barrio = ereg_replace("[^A-Za-z0-9 @.-/:]", "", $Barrio);

// Remove slashes.
$Nombre = stripslashes($Nombre);
$Email = stripslashes($Email);
$Barrio = stripslashes($Barrio);
$Comentario = stripslashes($Comentario);

// ###################################################################################
// ########## Reading and Writing the new data to the GuestBook Database #############

if ($Submit == "Yes") {

// Next line tells the script which Text file to open.
// La siguiente línea le dice a la secuencia de comandos que el archivo de texto para abrir.
$filename = "GuestBook.txt";

// Opens up the file declared above for reading

$fp = fopen( $filename,"r");
$OldData = fread($fp, 80000);
fclose( $fp );

// Gets the current Date of when the entry was submitted
$Today = (date ("d/m/Y",time()));


// Puts the recently added data into html format that can be read into the Flash Movie.
// You can change this up and add additional html formating to this area. For a complete listing of all html tags
// you can use in flash - visit: http://www.macromedia.com/support/flash/ts/documents/htmltext.htm

$Input = "Nombre: <b>$Nombre</b><br>Barrio: <b><u>$Barrio</u></b><br>Comentarios: <b>$Comentario</b><br><i><font size="-1">Fecha: $Today</font><br><br>.:::.";

/* This Line adds the '&GuestBook=' part to the front of the data that is stored in the text file. This is important because without this the Flash movie would not be able to assign the variable 'GuestBook' to the value that is located in this text file */

$New = "$Input$OldData";

// Opens and writes the file.

$fp = fopen( $filename,"w");
if(!$fp) die("&GuestBook=cannot write $filename ......&");
fwrite($fp, $New, 800000);
fclose( $fp );
}

// ###################################################################################
// ######### Formatting and Printing the Data from the Guestbook to the Flash Movie ##



// Next line tells the script which Text file to open.
// La siguiente línea le dice a la secuencia de comandos que el archivo de texto para abrir.
$filename = "GuestBook.txt";

// Opens up the file declared above for reading

$fp = fopen( $filename,"r");
$Data = fread($fp, 800000);
fclose( $fp );

// Splits the Old data into an array anytime it finds the pattern .:::.
$DataArray = split (".:::.", $Data);

// Counts the Number of entries in the GuestBook
$NumEntries = count($DataArray) - 1;

print "&TotalEntries=$NumEntries&NumLow=$NumLow&NumHigh=$NumHigh&GuestBook=";
for ($n = $NumLow; $n < $NumHigh; $n++) {
print $DataArray[$n];
if (!$DataArray[$n]) {
Print "<br><br><b>No hay mas comentarios</b>";
exit;
}
}
?>

alvaro

29/10/2009
excelente
muy bueno me funcionó 100pts saludos

Hector

18/11/2009
PROBLEMAS CON UNA CONSULTA DESDE PHP
Bueno mi problema es el siguiente.

Tengo la pagina web de un cliente en la cual el contenido es modificado desde un manejador de contenidos disenado para la pagina. La misma tiene una lista de productos pero al momento de hacer la inclucion de uno con sus caracteristicas cada capo de datos es escrito en las tablas de la base de datos, pero los caracteres son modificados, me refiero a las tildes acentos etc... Esto solo pasa si yo hago las modificaciones de los dastos de un producto determinado desde la herramienta de un manejador de contenido que esta en edit_pro.php, pero si me meto en las tablas de la base de datos por phpMyadmin y realizo las modificaciones de las caracteristicas del producto desde ahi al momento de verlo en la pagina inexplicablemente esta bien. Pero si vuelvo a entrar al manejador, a pesar que se encuentran bien las tablas, si realizo una modificacion desde el edit_pro.php aunque no toque los caracteres, altera todo lo que tenga simbolos.

Intente modificar las meta <meta http-equiv="Content-type" content="text/html; charset=utf-8" /> por otros ISO y la verdad es que no he podido.

Mi interrogante es porque si modifico las tablas directamente en mysql la pagina web ve los caracteres a pesar de ser un php y cuando lo modifico desde el manejador modifica todo el contenido, es decir me altera los caracteres?

Debo cambiar algun lenguaje en el msql?

Debo colocar alguna Meta etiqueta que solvente este problema?

De antemano muchas gracias por cualquier ayuda que me puedan brindar

Augusto Rocca

03/9/2010
UTF-8 Encoding Api Twitter
Excelente aporte, estaba usando la Api de Twitter y al mostrar la info recibida tenia este problema de enconding porque tengo mi pagina en iso-8859-1.

Simplemente con el utf8-decode se soluciono el problema... EXCELENTE.

Emanuel

20/10/2010
Espectacular..
Me alegraste el dia con el articuloo,

felicitaciones!!!

www.emanuelm.com.ar

arojas

08/5/2011
Perfecto !!
utf8_decode() funciona de maravilla para enviar un mail.

elpeter

06/7/2011
arreglar codificacion
usar el utf8_encode() o el utf8_decode() funciona pero no dejan de ser parches.
Arreglar de raíz el problema de la codificación es algo mas complicado o al menos que lleva bastante tiempo y "cosas" que tocar. Echarle un ojo al siguiente articulo donde viene bastante bien detallado los posibles problemas en la codificación y como afrontarlos. http://www.pedroventura.com/blog_programacion/php/problemas-codificacion-web-configurar-codificacion-utf8-php-mysql-y-html/

Espero que les sirva a todos. Porque se que los problemas de codificación pueden llegar a ser muy problemáticos! :S

elpeter

06/7/2011
arreglar codificacion
usar el utf8_encode() o el utf8_decode() funciona pero no dejan de ser parches.
Arreglar de raíz el problema de la codificación es algo mas complicado o al menos que lleva bastante tiempo y "cosas" que tocar. Echarle un ojo al siguiente articulo donde viene bastante bien detallado los posibles problemas en la codificación y como afrontarlos. http://www.pedroventura.com/blog_programacion/php/problemas-codificacion-web-configurar-codificacion-utf8-php-mysql-y-html/

Espero que les sirva a todos. Porque se que los problemas de codificación pueden llegar a ser muy problemáticos! :S

Adriana

20/7/2011
Me funciona perfecto
Muchas gracias por el aporte

RUBEN D. GUERRERO N.

24/1/2012
SIMPLEMENTE BUENOS
HERMANO MUY AGRADECIDO POR LA AYUDA PRESTADA ESTA MUY EXPLICITA LA EXPLICACION...

Gabriel

06/3/2012
Gracias
El articulo me fue muy util.

Saludos,

Omar Mtz

10/12/2012
I love u guys :)
Gracias por la explicacion tan sencilla que estaba.. hahaha

Edievale

29/12/2013
Muy útil
Me he puesto hace poco con PHP y me ha resultado muy útil este artículo.
Muchas gracias.

Raydel Piloto Quesada

28/2/2014
Hola
Hola a todos, el código me es útil. Pero no me ha resultado cuando tengo cadenas de texto con caracteres utf-b (Ñ, á,é , etc) guardados en una base de dato mysql y quiero mostrarlos tal y como son en una página web. Si me ayudasen con esto se los agradeceré. Gracias

Emmanuel

03/3/2014
Exelente solución
Muchas gracias por la solución fue de gran ayuda (Y)

Pedro

25/4/2014
Perfecta solucion
Gracias

Roger

16/5/2014
UTF-8
Y que pasa con el ?, yo no encuentro la manera de pintarlo en utf-8 al cojerlo de la bbdd.

Pep

25/9/2014
funcionó!
Funcionó muchas gracias!!! Un saludo.

XfontanillsX

24/12/2014
Ayuda
<html>
<head>
<title>Problema</title>
</head>
<body>
<?php
$ar=fopen("F:dosomg.txt","r") or
die("No se pudo abrir el archivo");
while (!feof($ar))
{
$linea=fgets($ar);
$lineasalto=nl2br($linea);
echo $lineasalto;
}
fclose($ar);
?>
</body>
</html>

Despues de haber mostrado el codigo que tengo, formulo la siguiente pregunta. Tengo un archivo de texto con el siguiente contenido:
EDGARDO@hotmail.com

Al tratar de mostrarlo en php me lanza el siguiente error:
Warning: fopen(F:dosscribir.txt): failed to open stream: Invalid argument .

Nota: no tengo problemas en mostrar contenido sin caracteres de este tipo como por ejemplo: jose.

Alexis

03/3/2015
no es acento
hola, muy buen articulo solo un error la palabra correcta debería de ser tilde y no acento :) saludos gracias por tus aportes son muy buenos.

Daniel

23/3/2015
encode
muy bueno funciono de maravilla gracias

Alex

26/4/2015
como proteger el codigo html de una pagina
si lo que se
anda buscando es proteger el codigo html la
solicion que les recomiendo es: www.protegerhtml.info saludos

ARNOLDO RODAS PEREZ

11/6/2015
Manejo de acentos a la hora de insertar
Buenas tardes , está muy buenas la informacion me parece perfecta el problema que yo tengo es que cuando lo guardo en mi propia máquina no hay problema, pero cuando subo los cambios al servidor me siguen apareciendo así, es por eso que quisiera saber si se resolvería el problema si yo a la hora de insertar los datos lo meto en el encode o decode, sea también el problema que se encuentre en mi servidor LINUX, por fa ayuda!

hector_rivera58472

03/12/2015
acentos dentro del rtf
hola que tal
yo segui e ejemplo de rtf segun este
link http://www.desarrolloweb.com/articulos/1826.php
yo lo no tengo problema al generarlo
pero si tengo un grave inconveniente con los acentos dentro del reporte que realice con rtf
resulta que la dbo de mysql la tengo con el acortejamiento utf-8spanis-ci, la pagina web esta con utf-8
cuando genero mi reporte con rtf los acentos se ven asi NÑO ONÑO acción acción acción acción
dentro de la web muestra las ñ y las tildes sin problema

utf8_decode($equivalencias[35][0]="#*OBJPY*#");
utf8_decode($equivalencias[35][1]="objetivospy");
$equivalencias[36][0]=utf8_decode("#*OBJPY*#");
utf8_decode($equivalencias[36][1]=utf8_decode("objetivospy");
he probado de muchas maneras y no salen los acentos dentro de mi reporte
alguien me puede dar una mano.. porfa

maria

11/12/2015
gracias por el truco!!!
Llevo un montón de foros y ninguno me ha dado una solución tan sencilla, solo colocar el código y funciona!!! Mil gracias por compartirlo!

ALDO

30/12/2015
¿Como lo aplico a todo el documento?
¿Como lo aplico a todo el documento?

proba

12/4/2016
funciono
tengo unas variables php dinamicas y usando esta funcion he podido solucionarlo muchas gracias
www.edilnet.es

EDUARDO

06/9/2016
agradecimiento
MUCHAS GRACIAS POR LA AYUDA

Alfonso

08/11/2016
Me quitaron un peso de encima
Muchas gracias por compartir este conocimiento, me fue de gran ayuda para resolver un asunto del trabajo para enviar mensajes codificados en UTF-8, cordial saludo

Johne789

22/2/2017
rtuoutte
I think you have remarked some very interesting points , appreciate it for the post. bdekddaggdef

Pharme881

22/2/2017
wyrryooi
Hello! [url=http://www.cia9online.com/#2.html]cialis online[/url]

Pharmd427

22/2/2017
reupueur
Hello! cialis online http://www.cia9online.com/#4.html

Pharma178

22/2/2017
yrypetoo
Hello!

Pharmb858

24/2/2017
oirpertr
Hello! [url=http://www.cia9online.com/#2.html]cialis[/url]

Pharmd911

24/2/2017
pywuyiou
Hello! cialis http://www.cia9online.com/#4.html

Pharmb546

24/2/2017
iitpwiti
Hello!

Pharmc928

25/2/2017
uttutppy
Hello!<a href="http://www.cia9online.com/#1.html">cialis</a>

Pharma860

25/2/2017
upyppewt
Hello! [url=http://www.cia9online.com/#2.html]cialis[/url]

Pharmd504

25/2/2017
ttwttpot
Hello! cialis http://www.cia9online.com/#4.html

Pharme890

25/2/2017
rrwypowr
Hello!

Pharmb953

26/2/2017
ttuiptiy
Hello!<a href="http://www.cia9online.com/#1.html">cialis</a>

Pharmd242

26/2/2017
puyuiwip
Hello! [url=http://www.cia9online.com/#2.html]cialis[/url]

Pharme770

26/2/2017
ieipoeip
Hello! cialis http://www.cia9online.com/#4.html

Pharmg599

26/2/2017
peeporep
Hello!

Pharmk651

27/2/2017
outypyuo
Hello!<a href="http://www.cia9online.com/#1.html">online pharmacy cialis</a>

Pharmk101

27/2/2017
opoueowt
Hello! [url=http://www.cia9online.com/#2.html]online pharmacy cialis[/url]

Pharmf923

27/2/2017
yrriwrur
Hello!

Pharmb982

01/3/2017
oriewpyp
Hello!<a href="http://www.cia9online.com/#1.html">cialis</a>

Pharme409

01/3/2017
erytereu
Hello! [url=http://www.cia9online.com/#2.html]cialis[/url]

Pharmg480

01/3/2017
oyrriyyy
Hello! cialis http://www.cia9online.com/#4.html

Pharmf505

01/3/2017
rieiturr
Hello!

Jose Manuel

22/5/2017
ok
Perfecta la explicación y funcina ok.