lunes, 19 de diciembre de 2016

Variante de solución a problemas de caracteres raros en aplicaciones web

 

paginas-webcopypaste1

¿Qué pasa cuando en los textos de la interface que está desarrollando aparecen caracteres “raros” en lugar de los caracteres acentuados y la eñe? Evidentemente estamos ante un problema con la codificación o el charset en las páginas devueltas por el servidor de aplicación, o hay algún problema con la codificación de los datos en las bases de datos utilizadas por la aplicación, o en el peor de los casos ambas. La cantidad de soluciones a este tipo de problemas publicadas en internet, en blogs y foros de desarrolladores es inmensa, y van desde las más sencillas como simplemente ajustar el atributo “content” de la etiqueta “meta” especificándole el charset de la página, ejemplo:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

o modificar algunos parámetros de la configuración de la base de datos, sus tablas y columnas, estableciendo el atributo cotejamiento o collation en la codificación correcta ejemplo “utf8_general_ci”. Hasta otras soluciones mucho más complejas como la definición de funciones tanto PHP, como JavaScript para intentar establecer la codificación correcta que elimine estos caracteres raros. Tras varios intentos aplicando algunas de las variantes encontradas, el problema de la codificación desaparecía parcialmente. Esto se debía a que los datos almacenados en base de datos estaban codificados de forma heterogénea, incluso en una misma tabla coexistían datos codificados en “ASCII“, “UTF8” y “LATIN”. Se expone este escenario porque puede ser similar al que se encuentren alguna vez cuando estén trabajando con bases de datos inmensas y la recodificación de esos datos lleve mucho tiempo o no sea viable.

La solución al problema vino precisamente, de una de las variantes encontradas, que en un inicio se estaba utilizando incorrectamente, a continuación, se expone una forma de llevar cualquier texto, sin importar en qué codificación se encuentre, a la codificación UTF8. Nuestro equipo utilizó la clase “Encoding” escrita por Sebastián Grignoli, la misma se puede descargar de internet, solamente es un archivo php y los incluimos en nuestra aplicación, dicha clase contiene varias funciones para reparar problemas de codificación. Por ejemplo, la función “fixUTF8”, toma como parámetro una cadena de texto, si la cadena de texto está correctamente codificada en UTF8, esta función no realiza cambios en la cadena y la devuelve sin cambios, por otro lado, si existiera algún problema de codificación esta función repara la cadena y la retorna correctamente codificada en UTF8. La otra función que comentaremos es “toUTF8”, esta como la función anterior recibe como parámetro una cadena de texto y la codifica a UTF8. Algo muy importante con esta última función si la cadena pasada por parámetro está en una codificación distinta a UTF8 esta función la convierte a UTF8, pero si la cadena ya está codificada en UTF8 esta función la recodificará a UTF8 lo cual nos brindará un resultado que definitivamente no es el que buscamos. Por lo que si utilizaremos estas funciones debemos hacer un aseguramiento de la entrada de datos y los resultados serán satisfactorios. Explicaremos el procedimiento mediante un ejemplo:

Vamos a suponer que tenemos una variable $cadena en la cual tenemos un texto que no sabemos su codificación.

1- Lo primero es averiguar si la codificación de la cadena es UTF8:

mb_detect_encoding($cadena, mb_detect_order(), true) == 'UTF-8'.

2- Según el resultado de esa condicional utilizar una de las dos funciones expuestas para reparar la codificación del texto contenido en la variable.

El autor del artículo empleo dichas funciones en el sistema que presento los problemas de codificación de la siguiente forma:

echo mb_detect_encoding($cadena, mb_detect_order(), true) == 'UTF-8' ?

Encoding::fixUTF8($cadena) :

Encoding::toUTF8($cct_obj->desc_turno);

Luego de su incorporación y utilización de la clase “Encoding” la aparición de caracteres raros ha sido erradicada, aunque la codificación que se utilizó, consideramos que es un poco extensa, para hacerlo un poco más legible le incorporaremos una función a esta clase para que el código anterior quede comprendido dentro de dicha función y sea más simple su uso.


¿Te ha gustado este Post? Compártelo con tus amigos.

No hay comentarios:

Publicar un comentario

IconIconIcon