strtouppper, strtolower, ucwords y la codificación

15 de November, 2008. Escrito por [Q]boss en PHP + MySQL, Recursos

En un proyecto reciente del estudio, hemos tenido que lidiar con la conversión de cadenas a minúsculas, mayúsculas y a frases capitalizadas. El proyecto partía de un Excel en el que todos los datos venían en mayúsculas, y por razones tanto de diseño como de legibilidad decidimos capitalizar los nombres de empresas, sectores, etc.

En principio con PHP lo teníamos fácil, ya que trae unas cuantas funciones conocidas para convertir cadenas a minúsculas, mayúsculas e incluso a formato titular (Cada Letra De Cada Palabra En Mayúscula).

Los problemas llegan al hablar de ASCII extendido. Para empezar, nuestra base de datos estaba en UTF8_general_ci, con lo que algo como ESPAÑA viene a ser ESPAÄ'A o algo similar. Aquí os dejo una página en php clarificadora de lo que ocurre al tratar de lograr el objetivo de manera directa:

Nota: la página está guardada como UTF8, y tiene se charset en la correspondiente etiqueta HTML.

PHP:
  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  5. <title>Test de Conversión de Cadenas en PHP</title>
  6. </head>
  7.  
  8. <body>
  9. <?php
  10.  
  11. $cadenaOriginal = "En EsPaÑA hAy MuchOs HIpÓcritas y PolíTicOS CoRruPtos";
  12.  
  13. echo ("CADENA ORIGINAL: ".$cadenaOriginal."<br />");
  14. // Arroja>> CADENA ORIGINAL: En EsPaÑA hAy MuchOs HIpÓcritas y PolíTicOS CoRruPtos
  15.  
  16. echo ("CADENA MAYÚSCULAS: ".strtoupper($cadenaOriginal)."<br />");
  17. // Arroja>> EN ESPAÑA HAY MUCHOS HIPÓCRITAS Y POLíTICOS CORRUPTOS
  18.  
  19. echo ("CADENA MINÚSCULAS: ".strtolower($cadenaOriginal)."<br />");
  20. // Arroja>> CADENA ORIGINAL: en espa�a hay muchos hip�critas y pol�ticos corruptos
  21.  
  22. echo ("CADENA CAPITALIZADA: ".ucwords(strtolower($cadenaOriginal))."<br />");
  23. // Arroja>> CADENA ORIGINAL: En Espa�a Hay Muchos Hip�critas Y Pol�ticos Corruptos
  24.  
  25. ?>
  26. </body>
  27. </html>

Lo que muestra esto por pantalla bajo Firefox:

Error en la conversión a minúsculas con php y strtolower y ucwords

Ahora nos ponemos manos a la obra, porque parece claro que nos encontramos con varios problemas:

1) Los acentos en minúsculas no los convierte a mayúsculas
2) Los caracteres de ascii extendido los rompe al convertir a minúsculas con strtolower
3) Con ucwords, y dado que tira de strtolower, ocurre 3/4 de lo mismo

La solución, aqui está:

1. El breikendan: decodificar la cadena (utf8_decode)
2. El cruzaito: pasarla a minúsculas (strtolower)
3. El Maikel Yason: pasarla a capitalizado (ucwords)
4. El rabocop: codificarla de nuevo (utf8_encode).

Resumiendo

PHP:

Y aqui os dejo un meneaito de ejemplo.Test Conversión en PHP

Comments

8 Responses to “strtouppper, strtolower, ucwords y la codificación”

  1. Zarate on November 15th, 2008 3:18 pm

    Las cosas que hay que acabar haciendo por los clientes… Es que te estoy imaginando haciendo el baile mientras picas el script y me parto : D

  2. [Q]boss on November 15th, 2008 3:24 pm

    XD

    Que pasa hombre! Y esto no es nada… verás cuando vuelva el modelo de caja!!

  3. Tecnorama on November 17th, 2008 7:45 pm

    Los programadores es que sois la leche!
    .laprimeraenmayusculas {
    text-transform: capitalize;
    }

    X-D

  4. [Q]boss on November 17th, 2008 8:10 pm

    La pena es que en flash ese CSS no funciona :(

  5. Tecnorama on November 17th, 2008 8:18 pm

    Pues no uses Flash, te lo tengo dicho. X-D

  6. [Q]boss on November 17th, 2008 8:49 pm

    Cuando me digas una manera mejor de hacer un CD interactivo, con video, posibilidad de impresión de fichas con un formato bastante más elaborado que un miserable HTML, etc. Pues entonces me lo pensaré.

    Saludos!

  7. Tecnorama on November 17th, 2008 9:35 pm

    ¿Y no les vale un gif animado en vez del video? 8-P

  8. [Q]Diseñata on November 18th, 2008 3:31 pm

    La vista me juega malas pasadas. Juro que la primera vez que miré rápidamente el título del post, entendí esto:

    http://www.schwimmerlegal.com/stormtroopers.jpg

Leave a Reply