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.
> CADENA ORIGINAL: En EsPaÑA hAy MuchOs HIpÓcritas y PolíTicOS CoRruPtos
echo ("CADENA MAYÚSCULAS: ".strtoupper($cadenaOriginal)."");
// Arroja >> EN ESPAÑA HAY MUCHOS HIPÓCRITAS Y POLíTICOS CORRUPTOS
echo ("CADENA MINÚSCULAS: ".strtolower($cadenaOriginal)."");
// Arroja >> CADENA ORIGINAL: en espa�a hay muchos hip�critas y pol�ticos corruptos
echo ("CADENA CAPITALIZADA: ".ucwords(strtolower($cadenaOriginal))."");
// Arroja >> CADENA ORIGINAL: En Espa�a Hay Muchos Hip�critas Y Pol�ticos Corruptos
?>
Lo que muestra esto por pantalla bajo Firefox:

Ahora nos ponemos manos a la obra, porque parece claro que nos encontramos con varios problemas:
- Los acentos en minúsculas no los convierte a mayúsculas
- Los caracteres de ascii extendido los rompe al convertir a minúsculas con strtolower
- 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
utf8_encode(ucwords(strtolower($cadena)));
[/pre]Y aqui os dejo un meneaito de ejemplo. Test Conversión en PHP
![[Q] Interactiva // Diseño, Web & Multimedia Oviedo, Asturias](http://q-interactiva.com/wp-content/uploads/logo.png)
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
XD
Que pasa hombre! Y esto no es nada… verás cuando vuelva el modelo de caja!!
Los programadores es que sois la leche!
.laprimeraenmayusculas {
text-transform: capitalize;
}
X-D
La pena es que en flash ese CSS no funciona
Pues no uses Flash, te lo tengo dicho. X-D
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!
¿Y no les vale un gif animado en vez del video? 8-P
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
Llevo 24 horas peleándome con el “charset” para arriba y para abajo porque, al convertir en altas o bajas, los acentos se vuelven un asco y así se registran en le BD. GRACIAS
Lo había intentado de muchas maneras sin éxito. Muchas gracias por compartir tan excelente solución.
Me alegro que te haya sido útil Lilian!