En muchas ocasiones nos encontramos con problemas al trabajar con carácteres como acentos, virgulillas y otros caracteres que no reconoce el navegador o en algún punto si no los normalizamos nuestras funciones no los reconocen correctamente o simplemente queremos trabajar con enlaces permanentes sin que el navegador nos los cambie por otros símbolos.

Convirtiendo UTF-8 a otra codificación en PHP

Uno de los usos que podemos ver son los enlaces permanente en sistemas como WordPress por ejemplo la transformación del siguiente texto:

Nuevas miradas sobre las niñas y los niños – Cuidado Cariñoso en Familia Ed. Inicial

En:

nuevas-miradas-sobre-las-ninas-y-los-ninos-cuidado-carinoso-en-familia-ed-inicial

Para lograrlo podemos pasar por muchos pasos, para reemplazar y eliminar caracteres que podrían causarnos problemas en nuestra url sobre todo si usamos algún carácter en específico para nuestras reglas de reescritura, pero vamos por partes…

1.- Primero convertimos nuestro texto de ejemplo a otra codificación utilizando la función iconv que nos ayuda a convertir nuestro texto entre las distintas codificaciones soportadas por php esta función nos solicita la codificación de entrada, la de salida y podemos agregar cadenas que nos ayudarán a modificar el resultado las cuales son:

  • //TRANSLIT – activa la transliteración, esto implica que si el carácter no puede ser representado en la nueva codificación puede aproximarse a caracteres parecidos.
  • //IGNORE – ignora los caracteres que no se encuentren representados en la nueva codificación.

Si no agregamos alguno de los anteriores simplemente nos generará un error al encontrarse con un carácter no existente en la nueva codificación, veamos el siguiente ejemplo:

$texto="Nuevas miradas sobre las niñas y los niños – Cuidado Cariñoso en Familia Ed. Inicial";
echo 'Original : '. $texto . "<br/>";
echo 'TRANSLIT : '. iconv("UTF-8", "ASCII//TRANSLIT", $texto)."<br/>";
echo 'IGNORE   : '. iconv("UTF-8", "ASCII//IGNORE", $texto)."<br/>";
echo '    : '. iconv("UTF-8", "ASCII", $texto)."<br/>";Lenguaje del código: PHP (php)

Con lo anterior tendremos el siguiente resultado:

Original : Nuevas miradas sobre las niñas y los niños – Cuidado Cariñoso en Familia Ed. Inicial
TRANSLIT : Nuevas miradas sobre las ni~nas y los ni~nos - Cuidado Cari~noso en Familia Ed. Inicial
IGNORE : Nuevas miradas sobre las nias y los nios Cuidado Carioso en Familia Ed. Inicial

Notice: iconv(): Detected an illegal character in input string on line 6

Con lo anterior avanzamos un poco al limpiar nuestra cadena de texto pero aun vemos algunos problemas así que continuaremos pero solamente utilizaremos //TRANSLIT y posteriormente convertiremos todos nuestros textos a minúsculas utilizando strtolower y después eliminamos otros caracteres y reemplazamos espacios utilizando preg_replace veamos el código para revisar los resultados:

//Texto original
$texto="Nuevas miradas sobre las niñas y los niños – Cuidado Cariñoso en Familia Ed. Inicial";
echo "Texto original: ".$texto."<br/>";
//Utilizamos iconv con //TRANSLIT para reemplazar nuestro texto por caracteres similares
$textotranslit = iconv("UTF-8", "ASCII//TRANSLIT", $texto);
echo "Texto anterior utiizando iconv: ".$textotranslit."<br/>";
//Mandamos el texto resultante a minúsculas
$textominusculas = strtolower($textotranslit);
echo "Texto anterior en minúsculas: ".$textominusculas."<br/>";
//Eliminamos caracteres especiales
$textosincaracteresespeciales = preg_replace("/[^a-z0-9\s-]/", "", $textominusculas);
echo "Texto anterior eliminando caracteres especiales: ".$textosincaracteresespeciales."<br/>";
//Eliminamos espacios en blanco y quitamos
$textosinespacios = trim(preg_replace("/[\s-]+/", "-", $textosincaracteresespeciales));
echo "Texto anterior sin espacios reemplazado por guiones: ".$textosinespacios."<br/>";Lenguaje del código: PHP (php)

Utilizando el código anterior obtendremos el siguiente resultado:

Texto original: Nuevas miradas sobre las niñas y los niños – Cuidado Cariñoso en Familia Ed. Inicial
Texto anterior utiizando iconv: Nuevas miradas sobre las ni~nas y los ni~nos - Cuidado Cari~noso en Familia Ed. Inicial
Texto anterior en minúsculas: nuevas miradas sobre las ni~nas y los ni~nos - cuidado cari~noso en familia ed. inicial
Texto anterior eliminando caracteres especiales: nuevas miradas sobre las ninas y los ninos - cuidado carinoso en familia ed inicial
Texto anterior sin espacios reemplazado por guiones: nuevas-miradas-sobre-las-ninas-y-los-ninos-cuidado-carinoso-en-familia-ed-inicial

Con esto hemos resuelto nuestro ejemplo inicial y podemos utilizarlo para convertir nuestros textos a enlaces permanentes que sean legibles fácilmente, ahora pongamos lo anterior en una función para ahorrarnos tiempo y poder reutilizar nuestro código de forma sencilla:

function url_limmpia($texto){
    $texto = iconv("UTF-8", "ASCII//TRANSLIT", $texto);
    $texto = strtolower($texto);
    $texto = preg_replace("/[^a-z0-9\s-]/", "", $texto);
    $texto = trim(preg_replace("/[\s-]+/", "-", $texto));
    return($texto);
}

$texto="Nuevas miradas sobre las niñas y los niños – Cuidado Cariñoso en Familia Ed. Inicial";

echo url_limmpia($texto);Lenguaje del código: PHP (php)

Con lo anterior tenemos el siguiente resultado:

nuevas-miradas-sobre-las-ninas-y-los-ninos-cuidado-carinoso-en-familia-ed-inicial

Espero lo anterior te sea de utilidad para tus proyectos, a continuación un par de extras:

UTF-8 en html

Lo primero que debemos tomar en cuenta es que generalmente trabajamos nuestros resultados con etiquetas html por lo que debemos confirmar que la codificación de nuestro documento esté correcta para que no modifique la información que compartimos y para ello basta una etiqueta dentro de <head> para asegurar que el navegador interprete correctamente la codificación usada. En este caso la meta etiqueta sería la siguiente:

<meta charset="UTF-8">Lenguaje del código: HTML, XML (xml)

UTF-8 al convertir textos

Algo que puede suceder también es que recibimos textos almacenados en distintos formatos y buscamos normalizarlos sobre todo nombres para ello utilizamos otras funciones existentes en PHP ejemplos:

Tenemos el siguiente apellido y tenemos que mandar solo la primera letra a mayúsculas y las demás a minúsculas:

ÑANDÚ

En PHP existe la función ucfirst que nos permite convertir la primera letra en mayúscula pero al ser mayúsculas todas nos entrega el mismo resultado (también existe ucwords que hace que la primera letra de cada palabra se convierta en mayúscula), veamos qué pasa si la utilizamos directamente:

$texto = "ÑANDÚ";
$texto2 = ucfirst($texto);
echo $texto2;Lenguaje del código: PHP (php)

Esto simplemente nos regresa la cadena original, por lo que tendremos que buscar una solución, entonces primero mandaremos el texto a minúsculas utilizando strtolower y veamos el resultado:

$texto = "ÑANDÚ";
$texto = strtolower($texto);
$texto2 = ucfirst($texto);
echo $texto2;Lenguaje del código: PHP (php)

De nuevo tendremos un resultado extraño ya que esta función no soporta UTF-8 directamente y nos entrega lo siguiente:

ÑandÚ

Entonces utilizaremos otra función que será: mb_strtolower la cual nos permite hacer la conversión utilizando UTF-8

$texto = "ÑANDÚ";
$texto = mb_strtolower($texto, 'UTF-8');
echo $texto;Lenguaje del código: PHP (php)

Con esto ya tenemos nuestro texto en minúsculas y podemos utilizar ucfirst para convertir solo la primera letra a mayúsculas o podeos utilizar otra función para hacer el trabajo con menos código, que en este caso sería mb_convert_case la cual nos permite hacer una conversión directa ya se a mayúsculas, minúsculas o título que será el que utilizaremos ahora:

$texto = "ÑANDÚ";
$texto = mb_convert_case($texto, MB_CASE_TITLE, "UTF-8");
echo $texto;Lenguaje del código: PHP (php)

Y así tendremos el resultado que necesitamos solo con una función ;). espero les sirva y si tienen alguna duda hagan contacto.