2012-10-05 39 views
5

tengo el siguiente código:¿Por qué mb_convert_case en PHP 5.4 está rompiendo mi cadena, cuando en 5.2 no?

header('Content-type: text/html; charset=utf-8'); 
$str = 'áá áá'; 
echo $str."\n"; 
echo mb_convert_case($str, MB_CASE_TITLE)."\n"; 
echo bin2hex($str)."\n"; 
echo bin2hex(mb_convert_case($str, MB_CASE_TITLE))."\n"; 

Uso de PHP 5.2.2, me sale el siguiente resultado:

áá áá 
áá áá 
c3a1c3a120c3a1c3a1 
c3a1c3a120c3a1c3a1 

Uso de PHP 5.4.3, me sale esto:

áá áá 
á� á� 
c3a1c3a120c3a1c3a1 
c3a1e3a120c3a1e3a1 

Mi salida esperada en ambos casos hubiera sido:

áá áá 
Áá Áá 
c3a1c3a120c3a1c3a1 
c381c3a120c381c3a1 

así que tengo dos preguntas:

  1. ¿Por qué no es el un ser convertida a una?
  2. ¿Por qué PHP 5.4 rompe mis cadenas?
+4

No se puede responder específicamente su pregunta, pero intente pasar explícitamente el parámetro '$ encoding' a' mb_convert_case' también. – deceze

+0

Sugeriría también lo que comentó @deceze. agregue el parámetro de codificación explícito. también verifique sus codificaciones predeterminadas para mb string. ¿En qué codificación está el archivo? – hakre

Respuesta

6

O pasan en $encoding a cada llamada a mb_ funciones, o juego:

mb_internal_encoding("UTF-8"); 

para asegurarse de PHP sabe qué codificación que está trabajando. De lo contrario, la codificación proviene del php.ini, o una ISO-8859-1 por defecto si no está incluida allí tampoco.

Por lo tanto, su instalación 5.4 está configurada por defecto en ISO-8859-1 y bajando así el byte inicial de la secuencia UTF-8, rompiéndolo. Lo mismo me ocurre en 5.2, así que tal vez haya algo más acerca de su instalación 5.2 que sea diferente, ¿quizás internal_encoding en el ini está configurado en otra cosa sin letras en esas posiciones de bytes?

+0

¡Ah, por supuesto, establecí los encabezados de codificación HTTP, pero mi internal_encoding no estaba configurado! De acuerdo con phpinfo() de PHP 5.2, mi configuración de mbstring.internal_encoding fue ISO-8859-1, mientras que en mi configuración de PHP 5.4, no está configurada ("sin valor"). Curiosamente, 5.4 parece tener el valor predeterminado ISO-8859-1 como sugirió (una llamada a mb_internal_encoding() sin parámetros lo confirma) pero el resultado difiere entre las dos versiones. Independientemente, establecer explícitamente el mbstring.internal_encoding a UTF-8 resuelve el problema en ambas versiones. ¡Gracias por tu ayuda! – Alex

Cuestiones relacionadas