Foros del Web » Programando para Internet » PHP »

strtolower y mb_strtolower operan distinto en diferentes servidores

Estas en el tema de strtolower y mb_strtolower operan distinto en diferentes servidores en el foro de PHP en Foros del Web. Estimados amigos de Foros del Web, estoy con un problema que me está complicando para variar... Trabajando localmente tanto página web como BD están en ...
  #1 (permalink)  
Antiguo 09/02/2012, 08:15
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 1 mes
Puntos: 336
strtolower y mb_strtolower operan distinto en diferentes servidores

Estimados amigos de Foros del Web, estoy con un problema que me está complicando para variar...

Trabajando localmente tanto página web como BD están en UTF8

Hace un tiempo tuve un problema al intentar convertir la letra eñe a minúscula usando la funcion strtolower() lo cual me generaba este problema:

echo strtolower("Español"); // Imprime Español

Así que usé mb_strtolower() que solucionó el problema:

echo mb_strtolower("Español", 'UTF-8'); // Imprime Español

Sin embargo trabajando remotamente a pesar de que también página web y BD están en UTF8 tengo problemas con mb_strtolower():

echo mb_strtolower("Español", 'UTF-8'); // No imprime nada y detiene la ejecución

Así de simple, al llegar a una linea que tiene mb_strtolower se detiene y no hace nada mas, como si fuese un die(), sin embargo curiosamente con strtolower funciona perfectamente:

echo strtolower("Español"); // Imprime Español

Ambas versiones de PHP son 5.2.x

He probado usando function_exists() en ambos servidores en ambas funciones y ambas existen, está claro que es un problema de PHP, lo que necesito es algún "truco" para hacerlo funcionar en ambos servidores.

Espero por favor que puedan ayudarme, no pueden ser parches como str_replace(), debe ser una solución real, ya que ese campo lo ingresa el usuario y pueden ser varios idiomas, español, português y Français

Gracias a todos los que me ayuden con esto!
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #2 (permalink)  
Antiguo 09/02/2012, 10:50
Avatar de pateketrueke
Modernizr
 
Fecha de Ingreso: abril-2008
Ubicación: Mexihco-Tenochtitlan
Mensajes: 26.399
Antigüedad: 16 años
Puntos: 2534
Respuesta: strtolower y mb_strtolower operan distinto en diferentes servidores

Si la ejecución se detiene significa que ocurre un error pero no lo estás viendo, ¿ya revisaste el log de errores?

Además otra parte importante es la codificación misma del script que contiene las cadenas, pon atención a ese detalle también.
__________________
Y U NO RTFM? щ(ºдºщ)

No atiendo por MP nada que no sea personal.
  #3 (permalink)  
Antiguo 09/02/2012, 15:19
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: strtolower y mb_strtolower operan distinto en diferentes servidores

Aparte ¿y si usas iconv? Solo debes saber cual codificacion te está trayendo. Otra forma es usar mb_detect_encoding y codificar conforme a la informacion que te brinde saber si codificar o no.
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #4 (permalink)  
Antiguo 13/02/2012, 09:48
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 1 mes
Puntos: 336
Respuesta: strtolower y mb_strtolower operan distinto en diferentes servidores

OMG ABIMAEL!!!

no conocía ninguna de esas 2, siempre sacándome de problemas, de seguro me sirven, si no, me tiro a un pozo...

Te cuento como me fué, lo primero es aprender a usar esas 2 funciones :)
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #5 (permalink)  
Antiguo 13/02/2012, 11:04
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 1 mes
Puntos: 336
Respuesta: strtolower y mb_strtolower operan distinto en diferentes servidores

Ok, no me ha ido tan bien, al usar mb_detect_encoding recibo en el servidor local "UTF-8", sin embargo en el servidor remoto me ocurre lo mismo que con mb_strtolower, o sea detiene su ejecución, intenté ponerle error_reporting(1) para que me diera algún mensaje, pero no pasó nada, no puedo revisar los logs de ese servidor, o al menos creo que no.

ahora estoy probando un tercer servidor, que también es remoto, increíblemente el resultado es distinto a los otros 2 casos, o sea ya van 3 servidores con distintos resultados.

CODIGO:
Código PHP:
header('Content-Type: text/html; charset=utf-8'); 
//mas codigo
echo "[".mb_detect_encoding($_SESSION['language'])."]:".$lan;
//mas codigo
$slang=utf8_encode($file);
$slangprint=ucfirst($slang);
echo 
$slangprint;
//el mb_strtolower está más abajo 
SERVIDOR LOCAL:
-----------
[UTF-8]:espa�ol
Español
-----------

SERVIDOR REMOTO ALTERNATIVO:
-----------
[UTF-8]:espa�ol
Español
-----------

SERVIDOR REMOTO DEFINITIVO:
-----------


-----------
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #6 (permalink)  
Antiguo 13/02/2012, 11:16
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: strtolower y mb_strtolower operan distinto en diferentes servidores

El problema lo más probable es que el archivo no está como utf-8 sin bom. Modifica que también el archivo sea esa codificación.

PD: No te veo en el pozo...
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #7 (permalink)  
Antiguo 13/02/2012, 11:28
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: strtolower y mb_strtolower operan distinto en diferentes servidores

Es muy raro que se pare en blanco, lo mejor sería que checaras los logs, es probable que la versión de PHP que tienen no tenga el soporte completo...
  #8 (permalink)  
Antiguo 13/02/2012, 11:28
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 1 mes
Puntos: 336
Respuesta: strtolower y mb_strtolower operan distinto en diferentes servidores

ok, modificando el php.ini logré que me mostrara el error, es el siguiente:

Fatal error: Call to undefined function mb_detect_encoding() in /var/www/web/lang.php on line 27.

así que al parecer es que las funciones empezadas en mb_ no están habilitadas D:

no se como activarlas, a ver que consigo

PD: el pozo era por si no me servía tu idea, y si sirvió de algo XD
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #9 (permalink)  
Antiguo 13/02/2012, 11:42
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: strtolower y mb_strtolower operan distinto en diferentes servidores

Según el manual, la única forma de habilitarlo es re-compilando:

http://www.php.net/manual/en/mbstring.installation.php
  #10 (permalink)  
Antiguo 13/02/2012, 15:17
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 1 mes
Puntos: 336
Respuesta: strtolower y mb_strtolower operan distinto en diferentes servidores

ok, eso es una pésima noticia, eso explica muchas cosas en realidad, como el hecho de que la funcion "exista" pero se caiga al ejecutarla.

Que no venga instalado por defecto y que haya que habilitarlo en la instalación significa que... tendré que explicarle al cliente como se hace...

a ver, de todos modos tengo un plan B, espero me ayuden please.

la razón por la que uso mb_strtolower es por que strtolower no funciona en el servidor local para convertir la letra Ñ en minúscula, pero si en el servidor definitivo.

saben por que sucede esto?

de todos modos intentaré hacer que el cliente recompile php con mbstring.
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #11 (permalink)  
Antiguo 13/02/2012, 15:56
Avatar de abimaelrc
Colaborador
 
Fecha de Ingreso: mayo-2009
Ubicación: En el planeta de Puerto Rico
Mensajes: 14.734
Antigüedad: 14 años, 11 meses
Puntos: 1517
Respuesta: strtolower y mb_strtolower operan distinto en diferentes servidores

¿iconv no te sirve?
__________________
Verifica antes de preguntar.
Los verdaderos amigos se hieren con la verdad, para no perderlos con la mentira. - Eugenio Maria de Hostos
  #12 (permalink)  
Antiguo 13/02/2012, 16:52
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: strtolower y mb_strtolower operan distinto en diferentes servidores

Eso es porque strtolower no soporta cadenas unicode (UTF8) por eso se recomienda el uso de mb_strtolower, por ejemplo este script sencillo, codificado como ANSI:
Código PHP:
Ver original
  1. <?php
  2. header('Content-type: text/html; charset=iso-8859-1');
  3. $str = setlocale(LC_ALL, 'es_MX', 'esp_mex');
  4. ?>
  5. <html>
  6. <head>
  7. <meta name="Content-type" content="text/html; charset=iso-8859-1">
  8. <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
  9. </head>
  10. <body>
  11. <?php
  12. $str = 'EsTOEsUÑAPruebaAcentosÁÉÍÓÚ';
  13. echo "Original: $str<br />";
  14. echo 'LowerCased: ' . strtolower($str) . '<br />';
  15. ?>
  16. </body>
  17. </html>

Funciona correctamente ej:
Cita:
Original: EsTOEsUÑAPruebaAcentosÁÉÍÓÚ
LowerCased: estoesuñapruebaacentosáéíóú
Sin embargo si lo haces en un script codificado como UTF-8:
Código PHP:
Ver original
  1. <?php
  2. header('Content-type: text/html; charset=utf-8');
  3. $str = setlocale(LC_ALL, 'es_MX', 'esp_mex');
  4. ?>
  5. <html>
  6. <head>
  7. <meta name="Content-type" content="text/html; charset=utf-8">
  8. <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
  9. </head>
  10. <body>
  11. <?php
  12. $str = 'EsTOEsUÑAPruebaAcentosÁÉÍÓÚ';
  13. echo "Original: $str<br />";
  14. echo 'LowerCased: ' . strtolower($str) . '<br />';
  15. echo 'LowerCased: ' . mb_strtolower($str) . '<br />';
  16. ?>
  17. </body>
  18. </html>

La salida:
Cita:
Original: EsTOEsUÑAPruebaAcentosÁÉÍÓÚ
LowerCased: estoesu�apruebaacentos�����
LowerCased: estoesuñapruebaacentosáéíóú
¿Solución? Decide bien que juego de carácteres vas a ocupar, por ejemplo, si va a ser UTF-8 checa que tengas todo el soporte, de lo contrario regresa a iso-8859-1, y asegurate que todo, tus archivos, documentos html y bdd se comuniquen con el mismo charset.

Saludos.
  #13 (permalink)  
Antiguo 14/02/2012, 07:16
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 16 años, 1 mes
Puntos: 336
Respuesta: strtolower y mb_strtolower operan distinto en diferentes servidores

Cita:
Iniciado por abimaelrc Ver Mensaje
¿iconv no te sirve?
Si sirve, no me ha dado problemas, solo que no he logrado pensar en donde usarlo...

Cita:
Iniciado por GatorV Ver Mensaje
Eso es porque strtolower no soporta cadenas unicode (UTF8) por eso se recomienda el uso de mb_strtolower

¿Solución? Decide bien que juego de carácteres vas a ocupar, por ejemplo, si va a ser UTF-8 checa que tengas todo el soporte, de lo contrario regresa a iso-8859-1, y asegurate que todo, tus archivos, documentos html y bdd se comuniquen con el mismo charset.

Saludos.
a ver, eso quiere decir que si convierto la cadena a iso-8859-1 con iconv() o uso utf8_decode() antes de hacer el substr() debería funcionar no?

voy a probar eso antes de intentar pasar todo a otra codificación, más que nada por que los plazos de entrega están vencidos, no me conviene configurar todo, al menos no por ahora.

Por cierto muchas gracias a ambos, no habría podido saber nada de esto averiguando por mi cuenta!
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D

Etiquetas: distinto, servidores, strtolower, usuarios
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 14:03.