Comunidad de diseño web y desarrollo en internet

Solución a problema con ñ y acentos en PHP

Bien, un problema muy común que se le puede presentar a todos en PHP es que al momento de llamar datos procesados algún tipo de limpiador de String (anti-injecciones de código), nos genera un cambio en la estructura del texto en un formato diferente al de UTF-8 que requerimos para que todos los símbolos de los lenguajes derivados del latín sean reconocidos.

El problema


Ayer (14/Octubre/11) en twitter un conocido que tiene un negocio de venta de hosting y dominios estaba codeando en PHP pero sus salidas al explorador no reconocían las ñ, ni los acentos.

Aún después de colocar un echo al inicio con " <meta chartset="utf-8" />" y verificar que su base de datos también tuviera la misma configuración, seguía tenido ese problema.

Entonces, el problema no era del tipo de lectura que hace nuestro documento, sino el tipo de output que tiene nuestro contenido. El contenido (si eres una persona sensata y sabes lo básico de seguridad) debe ser limpiado antes de ejecutar cualquier función que use datos obtenidos de algún formulario.

El procedimiento normal sería algo así:

Código :

function limpiarString($string) //función para limpiar strings
   {
      $string = strip_tags($string);
      $string = htmlentities($string);
      return stripslashes($string);  
// si llevaremos esto a mySQL deberímos agregar al final mysql_real_escape_string($string);
   }


La función que nos interesa dentro de esta misma función es htmlentitites(), que realiza un ajuste completo de la string y lo convierte en entidad independiente de HTML, entonces, al realizar este proceso lo convierte a un estilo default que no incluye ñ y acentos.

Por esa razón algunas veces vemos sitios que usan CMS con problemas con los acentos y las ñ sólo en algunas secciones del sitio que llaman datos procesados con esta función.

La solución


Si estas usando un CMS o algún ajeno que tenga origen no latino, es muy probable que tenga alguna función de limpieza, encuéntrala en entre las funciones.

Si eres un entusiasta y estas codeando tu mismo la aplicación no olvides agregar estos parámetros a la función htmlentities()

Código :

   $string = htmlentities($string, ENT_QUOTES,'UTF-8'); // así de sencillo

   //también podrías usar 
   $string = htmlentities($string, ENT_QUOTES | ENT_HTML401, 'UTF-8')  // Pero eso es otra historia


Explicación


Bien, ENT_QUOTES es una propiedad que tiene la función que convierte las comillas( " ) y la comilla simple ( ' ), hay muchas otras, si te interesa puedes verificar las propiedades de la función en el Manual PHP.

Y el 'UTF-8' le especifica a la función que el tipo de set de caracteres(charset) que queremos usar es el UTF-8, que contiene los caracteres latinos como la ñ y las letras con acentos.

Y! eso es todo, espero les sirva, igual tienen ahí un tipo de seguridad anti inyecciones de código ;)

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate