2009-09-19 8 views

Odpowiedz

15

Krótko mówiąc: tak naprawdę nie wiesz o kodowaniu (zestawie znaków) używanym w zmiennych, które są przekazywane do skryptu PHP za pośrednictwem GET lub POST (w szczególności problemem jest tutaj GET). W konwencjonalnych przeglądarkach formularze POST do zasobu po stronie serwera określonego w action -wartość przy użyciu kodowania stron, które można określić za pomocą tagu tagu http-equiv (charset -meta-tag w HTML5) lub przez nagłówek HTTP. Alternatywnie niektóre przeglądarki również respektują atrybut accept-charset w formularzu podczas wybierania właściwego kodowania.

Kodowanie parametrów GET i samego adresu URL zależy od ustawień przeglądarki i dlatego może być kontrolowane przez użytkownika. Nie powinieneś polegać na określonym kodowaniu.

Generalnie ominiesz większość problemów związanych z kodowaniem, konsekwentnie używając kodowania UTF-8 do wszystkich celów i określając poprawne kodowanie w nagłówku HTTP (Content-Type: text/html; charset=UTF-8) - dzięki temu uzyskasz poprawne kodowanie (UTF-8) we wszystkich zmienne, które są przekazywane do twojego łańcucha znaków (nie mówimy o skryptach rouge, które celowo próbują zepsuć kodowanie, aby umożliwić wektory ataku do twojego skryptu). Nie powinieneś także polegać na znakach spoza ASCi w parametrach GET lub w adresie URL (to także powód, dla którego linki przyjazne SEO usuwają te znaki lub zastępują je).

Jeśli upewniłeś się, że UTF-8 jest jedynym dozwolonym zestawem znaków, możesz użyć mb_strlen($string, 'UTF-8'), aby sprawdzić na przykład długość zmiennej.

EDIT: (dodane niektóre łącza)

Niektóre rzeczy do przeczytania:

+0

Kodowanie adresu URL zależy również od dokumentu odsyłającego. Tylko jeśli adres URL zostanie wprowadzony bezpośrednio w pasku adresu, ustawienia przeglądarki mają kluczowe znaczenie. – Gumbo

5

użyć mb_internal_encoding, aby wiedzieć, które kodowanie jest aktualnie ustawione. Jeśli aplikacja używa logu o innym kodowaniu, lepiej użyć mb_strlen.

Cheers

1

Zazwyczaj masz kontrolę nad kodowaniem znaków skoro stworzyć $ _REQUEST z HTML wysyłanej do klienta.

tj .: Jest generowany przez stronę wysłaną z PHP.

Dzięki temu nie trzeba wykrywać kodowania.

Używanie mb_functions wymaga włączenia rozszerzenia wielobajtowego - więc jeśli rozpowszechniasz kod, musisz być świadomy, że nie wszyscy go otrzymają.

header('Content-Type: text/html; charset=UTF-8'); 

OR w HTML:

<meta charset="utf-8"> 

http://www.w3.org/International/O-charset

Edit: PHP6 ma UTF-8, a nie PHP5.

+0

„funkcje łańcuchowe są UTF-8 zgodny” . czy to oznacza, że ​​strlen w php5 zwróci prawidłową długość ciągu utf8? – lovespring

+0

"Począwszy od PHP5, funkcje łańcuchowe są kompatybilne z UTF-8." To zdecydowanie nie jest poprawne. Wewnętrzne funkcje napisów PHP działają na poziomie bajtu, co oznacza, że ​​nie mogą obsługiwać znaków wielobajtowych (dotyczy PHP <6). Wszystkie wewnętrzne funkcje, w których długość znaku (w bajtach) jest ważna dla jego działania, są podatne na błędy podczas pracy z tymi zestawami znaków. Wspomniane rozszerzenie wielobajtowe (mb_ *) ma zdolność przeciążania, ale zdecydowanie odradzam jego używanie. –

+0

Byłem daleko, PHP5 nie ma wsparcia wielobajtowego. – bucabay

Powiązane problemy