Foros del Web » Programando para Internet » PHP »

Caso extraño con caracteres utf-8 y strtolower

Estas en el tema de Caso extraño con caracteres utf-8 y strtolower en el foro de PHP en Foros del Web. Hola, estuve casi dos días resolviendo un desagradable incidente con unos caracteres que se mostraban como si estuviese trabajando utf-8 en un documento formateado en ...
  #1 (permalink)  
Antiguo 14/01/2009, 21:36
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Caso extraño con caracteres utf-8 y strtolower

Hola, estuve casi dos días resolviendo un desagradable incidente con unos caracteres que se mostraban como si estuviese trabajando utf-8 en un documento formateado en ansi. Esto sólo se dio cuando apliqué strtolower para cambiar todo a minúsculas. Al final lo resolví así:

Código PHP:
function logtitulo() {
  
$titulo 'ÁÉÍÓÚÑáéíóúñ¿¡<>';
  
$titulo strtr(strtolower($titulo), utf8_decode'ã¡ã©ã*ã³ãºã±ã¡ã©ã*ã³ãºã±â¿â¡' ), 'ÁÉÍÓÚÑáéíóúñ¿¡');
  echo 
$titulo;

Ahora bien, si un documento está formateado como utf-8, está declarado como utf-8 en la cabecera ¿por qué se mostraban los caracteres de forma errónea?. Nunca antes había usado strtolower, no sabía que era tan problemático en este sentido.
  #2 (permalink)  
Antiguo 14/01/2009, 23:01
Avatar de kaninox  
Fecha de Ingreso: septiembre-2005
Ubicación: In my House
Mensajes: 3.597
Antigüedad: 18 años, 7 meses
Puntos: 49
Respuesta: Caso extraño con caracteres utf-8 y strtolower

a lo mejor en tu pagina estas claramente trabajando con utf-8 en tonce al pasar variables con acentos directamente sin POST o GET y darle strtolower puede que te pase estos acentos a cosas raras podrias haber pasado las cosas con htmlentities por ejemplo y a lo mejor te evitas el tranformar con decode o encode en su caso.....

aunque siendo sinceros es arto raro X) por que nunca he tenido problemas con pasar a minusculas....
a lo mejor y es problema de la conf. del server que se yo...

saludos...
__________________
Gokuh Salvo al mundo. PUNTO!!!!
  #3 (permalink)  
Antiguo 14/01/2009, 23:08
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 17 años, 11 meses
Puntos: 2135
Respuesta: Caso extraño con caracteres utf-8 y strtolower

Mmm el texto lo extraes de alguna BDD?
  #4 (permalink)  
Antiguo 14/01/2009, 23:44
Avatar de metacortex
Viejo demente
 
Fecha de Ingreso: junio-2004
Ubicación: Caracas - Venezuela
Mensajes: 9.027
Antigüedad: 19 años, 10 meses
Puntos: 832
Respuesta: Caso extraño con caracteres utf-8 y strtolower

Kaninox no se me ocurrió lo de htmlentities, gracias por mencionarlo. Igualmente puede ser la configuración del servidor, aunque lo único que le hice fue activarle un par de extensiones al php y algún otro de Apache. Todo lo demás está 'de paquete'.

GatorV, originalmente sí estaba trabajando con contenido de la BD, pero posteriormente puse texto estático a la variable con el mismo resultado (tal como el ejemplo). De hecho me ayudé con ese error al copiar los caracteres y pegarlos en el 2do argumento.
  #5 (permalink)  
Antiguo 15/01/2009, 01:45
 
Fecha de Ingreso: octubre-2004
Mensajes: 2.627
Antigüedad: 19 años, 5 meses
Puntos: 48
Respuesta: Caso extraño con caracteres utf-8 y strtolower

Creo que strtolower no entiende mas que el ascii, por eso el utf8 seguro que le vuelve loco.

Esperemos que en PHP6 se acaben todos los lios de las codificaciones de caracteres.
  #6 (permalink)  
Antiguo 15/01/2009, 09:04
 
Fecha de Ingreso: abril-2006
Mensajes: 1.128
Antigüedad: 18 años
Puntos: 33
Respuesta: Caso extraño con caracteres utf-8 y strtolower

Talvez esto, tomado del manual de php
puede ayudar a entender esta funcion ->
Cita:
This function is sensible to the current locale, namely the LC_CTYPE category (the default LC_CTYPE category is set from the LANG environment variable or by an explicit LC_CTYPE setting, but it can be overriden by the LC_ALL environment setting). If no locale setting is done in the enironment, the default locale will be C, for which the lowercase/uppercase conversion is based on the default character set of the system: this may convert only ASCII letters, or also ISO-8859-1 letters depending on the system...
Saludos
Franco
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 04:11.