strtolower y los acentos en php

En php existe una función muy simple que te pasa una cadena dada a minúsculas. Esta función es strtolower y, a priori no tiene mucha complicación. Pero cuando un día empiezas a ver tu base de datos o sitio web con palabras malformadas te mosquea, empiezas a estudiar el problema y concluyes que no pasa bien a minúsculas los caracteres que no pertenecen al ascii-7. En teoría depende del locale de la maquina, pero ¿porque hacer código dependiente de mil variables de sistema?.

Por lo tanto la función, tan necesaria como simple, no nos vale por si misma para el propio idioma español ya que convierte cadenas como "LOGROÑO" a "logroÑo" y "DÍA" a "dÍa".

La solución pasa por hacer un paso previo al strtower que convierta estos caracteres:

PHP:
  1. function strtolowerExtended($str)
  2. {     
  3.         $low = array(chr(193) => chr(225), //á
  4.                      chr(201) => chr(233), //é
  5.                      chr(205) => chr(237), //í­
  6.                      chr(211) => chr(243), //ó
  7.                      chr(218) => chr(250), //ú
  8.                      chr(220) => chr(252), //ü
  9.                      chr(209) => chr(241)  //ñ
  10.                      );
  11.  
  12.  
  13.       return strtolower(strtr($str,$low));
  14.  
  15. }

Es mejor poner los caracteres acentuados con chr o hexadecimal para no tener problemas cuando cambias a un sistema de ficheros sin soporte local para esos caracteres.

Consejo: cuando usas una función php, lee los comentarios de la gente bajo la explicación de la sintaxis en la referencia de la web, te ahorrará trabajo.

4 Responses to “strtolower y los acentos en php”

  1. Albin Says:

    Recientemente he estado haciendo una web de gramática alemana y he podido observar las aberraciones a las que se pueden llegar si no se lleva cuidado con los CharSet y los Collation de MySQL y de PHP …

    Por parte de PHP siempre que puedo utilizo las funciones que comienzan por mb_ (multibyte string) y cuando no puedo (preg_replace_callback por ejemplo no está migrada a multibyte), pues utilizo utf8_decode y luego utf8_encode …

  2. Covi Says:

    Consejo: cuando usas una función php, lee los comentarios de la gente bajo la explicación de la sintaxis en la referencia de la web, te ahorrará trabajo.:( que gran verdad.

    Pues nada, se agradece encontrar estas referencias por ahí, llevo años usando strtolower y no lo sabía! :D
    Por alguna extraña razón nunca tuve conflictos, con los acentos por ejemplo, imagino que la usé siempre con caracteres “estándares”, anglosajones… para chequeos de formularios, nombres de archivo… digo yo ^^

    Lo dicho, se agradece ;)

    PD: UTF-8, UTF-8, UTF-8 gg

  3. frandy Says:

    Muchisimas gracias por este post. Tenia el problema de que no no podia poner en minusculas palabras acentuadas. Pero con tu post ya resolvi mi problema.

    Saludos.

  4. unisho Says:

    Muchas gracias por el aporte me ha sido de gran utilidad.

    Saludos.

Leave a Reply

This is a captcha-picture. It is used to prevent mass-access by robots. (see: www.captcha.net)

Debes leer y teclear los 5 caracteres entre 0..9 y A..F, y enviar la respuesta.

  

No puedo leer esto. Por favor, generar un