2012-10-05 4 views
5

Mam następujący kod:Dlaczego funkcja mb_convert_case w PHP 5.4 przerywa mój ciąg znaków, gdy w wersji 5.2 tak się nie dzieje?

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"; 

Korzystanie z PHP 5.2.2, pojawia się następujący komunikat:

áá áá 
áá áá 
c3a1c3a120c3a1c3a1 
c3a1c3a120c3a1c3a1 

pomocą PHP 5.4.3, mam to:

áá áá 
á� á� 
c3a1c3a120c3a1c3a1 
c3a1e3a120c3a1e3a1 

Moje oczekiwane wyniki w obu przypadkach byłyby następujące:

áá áá 
Áá Áá 
c3a1c3a120c3a1c3a1 
c381c3a120c381c3a1 

Mam więc dwa pytania:

  1. Dlaczego nie istota przekształca się w?
  2. Dlaczego PHP 5.4 przerywa moje łańcuchy?
+4

Nie mogę konkretnie odpowiedzieć na twoje pytanie, ale spróbuj jawnie przekazać parametr '$ encoding' do' mb_convert_case'. – deceze

+0

Proponuję również, co komentarz @deceze. dodaj jawny parametr kodowania. sprawdź także domyślne kodowanie ciągu mb. w którym kodowaniu jest plik? – hakre

Odpowiedz

6

Albo przechodzą w $encoding na każde wezwanie do mb_ funkcji lub ustaw:

mb_internal_encoding("UTF-8"); 

aby upewnić PHP wie co kodowania ty pracujesz. W przeciwnym razie kodowanie pochodzi z php.ini lub domyślnego ISO-8859-1, jeśli nie jest tam zawarte.

Tak więc instalacja 5.4 jest domyślnie ustawiona na ISO-8859-1, a więc obniżenie bajtu wiodącego sekwencji UTF-8, łamanie jej. To samo dzieje się dla mnie w 5.2, więc może jest coś jeszcze w waszej instalacji 5.2, która jest inna - może internal_encoding w ini jest ustawiona na coś innego bez liter w tych pozycjach bajtów?

+0

Ah, oczywiście, ustawiłem nagłówki kodowania HTTP, ale moje internal_encoding nie zostało ustawione! Zgodnie z phpinfo() PHP 5.2, moje ustawienie mbstring.internal_encoding było ISO-8859-1, podczas gdy w mojej konfiguracji PHP 5.4, to nie jest ustawione w ogóle ("brak wartości"). Interesujące jest jednak, że 5.4 wydaje się domyślnie ISO-8859-1 zgodnie z sugestią (wywołanie mb_internal_encoding() bez parametrów potwierdza to), ale wyniki różnią się w zależności od wersji. Niezależnie od tego, jawne ustawienie mbstring.internal_encoding na UTF-8 rozwiązuje problem w obu wersjach. Dzięki za pomoc! – Alex

Powiązane problemy