Jak mogę poznać zestaw znaków w $ _REQUEST? i jak ustawić zestaw znaków $ _REQUEST?strlen, mb_strlen, którego użyć?
Odpowiedz
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:
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
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.
„funkcje łańcuchowe są UTF-8 zgodny” . czy to oznacza, że strlen w php5 zwróci prawidłową długość ciągu utf8? – lovespring
"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. –
Byłem daleko, PHP5 nie ma wsparcia wielobajtowego. – bucabay
- 1. mb_strlen() czy to wystarczy?
- 2. Którego kompilatora D użyć?
- 3. JsonResult lub Json: którego użyć?
- 4. , którego z == i =: = powinienem użyć?
- 5. szybszy strlen?
- 6. Buforowany vs nie buforowany, którego użyć?
- 7. Liquibase vs Flyway, którego należy użyć?
- 8. BottomSheetDialog/BottomSheetDialogFragment - którego użyć i jak?
- 9. Czy istnieje nieczytelny ReadWriteLock, którego mogę użyć?
- 10. widok Androida lub surfaceView, którego powinienem użyć?
- 11. Jak mogę powiedzieć, którego vim użyć?
- 12. Którego adaptera CouchDB dla Ruby powinienem użyć?
- 13. strlen: jak to działa?
- 14. libunistring u8_strlen() równa się strlen()?
- 15. zrozumienie funkcji strlen w C
- 16. Którego pakietu wyszukiwania pełnotekstowego należy użyć dla SQLite3?
- 17. Którego użyć Auth :: check() lub Auth :: user() - Laravel 5.1?
- 18. Którego typu Boolean należy użyć w iOS/Objective-C?
- 19. Różnica między getcwd() i dirname (__ FILE__)? Którego powinienem użyć?
- 20. Wiosenny WZP: Konstruktor kwerend kontra Kreator kryteriów, którego użyć?
- 21. ARG lub ENV, którego użyć w tym przypadku?
- 22. Którego powinienem użyć między sprężynowym, sprężynowym BOM i sprężynowym IO?
- 23. którego menedżera transakcji powinienem użyć (JTA vs JPA)?
- 24. strlen nie podając prawidłowej długości napisu C
- 25. Czy "strlen()" w czasie kompilacji działa efektywnie?
- 26. Którego typu powinienem używać?
- 27. regex, którego nie rozumiem
- 28. Błąd kompilacji GCC: deklaracja 'strlen' musi być dostępna
- 29. strlen - długość sznurka jest czasami zwiększana o 1
- 30. "Nie zadeklarowany w tym zakresie" podczas używania strlen()
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