W całym Internecie, w tym w stackoverflow, zaleca się użycie mb_http_input ('utf-8'), aby PHP działało w kodowaniu UTF-8. Na przykład zobacz PHP/MySQL encoding problems. â�� instead of certain characters. Z drugiej strony, instrukcja PHP mówi, że nie możemy naprawić kodowania wejściowego w skrypcie PHP i że mb_http_input jest tylko sposobem sprawdzenia, co to jest, a nie sposobem na ustawienie. Zobacz http://www.php.net/manual/en/mbstring.http.php i http://php.net/manual/en/function.mb-httpetinput.php. Ok, to było tylko wyjaśnienie kontekstu przed pytaniem. Wydaje mi się, że istnieje wiele nadmiarowych poleceń w Apache + PHP + HTML, aby kontrolować konwersję z kodowania wejściowego do wewnętrznego kodowania i ostatecznie do kodowania wyjściowego. Nie rozumiem użyteczności tego. Na przykład, jeśli pierwotnym wejściem kodującym z jakiegoś zewnętrznego klienta HTTP jest EUC-JP, a ja ustawiam kodowanie wewnętrzne na UTF-8, to PHP musiałoby dokonać konwersji. Czy mam rację? Jeśli mam rację, dlaczego miałbym ustawić kodowanie wejściowe w php.ini (zamiast tylko przekazywać oryginał), biorąc pod uwagę, że byłby on następnie natychmiastowo przekonwertowany na kodowanie wewnętrzne utf-8? Podobne pytanie dotyczy wyjścia. We wszystkich moich plikach htpp używam metatagu z charset = utf-8. Zatem wyjściowe kodowanie HTTP zostało naprawione. Ponadto w PHP.ini mogę ustawić wartość default_charset, która pojawi się w nagłówku HTTP do utf-8. Dlaczego miałbym zadawać sobie trud korzystania z mb_http_output ("uft-8"), gdy ostateczne kodowanie wyjściowe jest już naprawione. Podsumowując, czy ktoś może dać mi praktyczny konkretny przykład, w którym mb_http_output ('uft-8') jest wyraźnie potrzebny i nie może być zastąpiony przez zwykłe polecenia, które często są wstawiane domyślnie w edytorach takich jak Dreamweaver?Jaka jest przydatność mb_http_output(), biorąc pod uwagę, że kodowanie wyjściowe jest zazwyczaj ustalane w inny sposób?
Odpowiedz
Te dwie opcje są najgorszym pomysłem, jaki kiedykolwiek mieli projektanci PHP, i mieli mnóstwo złych pomysłów, jeśli chodzi o kodowanie.
celu konwersji ciągów znaków do specyficzny kodowania, trzeba wiedzieć, co jest konwersja kodowania jeden z. Dane przychodzące są często w niezadeklarowanym kodowaniu; serwer po prostu otrzymuje niektóre dane binarne, nie wie, co to jest kodowanie. Powinieneś zadeklarować, jakie kodowanie oczekujesz od przeglądarki, ustawiając w formularzach atrybut accept-charset
; zrobienie tego nie gwarantuje, że przeglądarka to zrobi i nie sprawi, że PHP będzie wiedział, czego kodowanie się oczekuje.
To samo dotyczy danych wyjściowych; Łańcuchy PHP są po prostu tablicami bajtowymi, nie mają skojarzonego kodowania. Nie mam pojęcia, jak PHP myśli, że wie, jak konwertować arbitralne ciągi do określonego kodowania na danych wejściowych lub.
Należy obsłużyć to ręcznie, a to naprawdę łatwe do zrobienia i tak: deklarują klientom kodowanie można oczekiwać, czeku czy wejście znajduje się w prawidłowym kodowaniu z wykorzystaniem mb_check_encoding
(nie _detect encoding
czy coś takiego, po prostu check) , odrzuć nieprawidłowe dane wejściowe, zadbaj o zachowanie wszystkiego w tym samym kodowaniu w obrębie całego przepływu aplikacji. Oznacza to, że w przypadku Twojej aplikacji nie masz żadnej konwersji .
Jeśli zrobić konieczność konwersji w dowolnym momencie, sprawiają, że kanapki Unicode: konwersja wejście od oczekiwanego kodowania UTF-8 lub innego kodowania Unicode na wejściu, przekonwertować go z powrotem do pożądanego kodowania wyjściowego na wyjściu. Za każdym razem, gdy musisz dokonać konwersji, upewnij się, że wiesz, co konwertujesz: z. Nie możesz magicznie "tworzyć wszystkich łańcuchów UTF-8" za pomocą jednej deklaracji.
Co z tym standardem: http://www.w3.org/International/O-HTTP-charset.en.php? To nie jest przydatne? –
@ Dominic108 Pewnie, że to jest przydatne. Deklaruje * przeglądarce * kodowanie strony. * Musisz * ustawić to. To jednak nie zmienia niczego, co napisałem powyżej. Być może zobacz [Obsługa Unicode z przodu do tyłu w aplikacji sieciowej] (http://kunststube.net/frontback/), aby uzyskać więcej informacji. – deceze
Zauważyłem, że IE 9 nie będzie zawierał zestawu znaków w nagłówku, który wysyła, nawet jeśli w formularzu określam accept-charset = "UTF-8". Nie mówię tego w opozycji do tego, co napisałeś. Tylko to zauważam. –
- 1. Biorąc pod uwagę, że p jest wskaźnikiem jest "p> nullptr" dobrze uformowany?
- 2. Biorąc pod uwagę, że obiekt jest tablicą dowolnego typu, w jaki sposób testujesz, czy jest on pusty w Javie?
- 3. Biorąc pod uwagę dwa ciągi, jest jednym anagram drugiej
- 4. Dlaczego możliwe jest przedefiniowanie Var (biorąc pod uwagę, że w wartościach FP są niezmienne)?
- 5. Jaki jest "poprawny" sposób tworzenia wątku zatrzymanego w Pythonie, biorąc pod uwagę zatrzymywane pseudoatomowe jednostki pracy?
- 6. Czy Erlang jest naprawdę szybki, biorąc pod uwagę wiele kopii pamięci pod maską?
- 7. Biorąc pod uwagę szereg booleans, jaki jest najskuteczniejszy sposób, aby wybrać indeks losowej wartości TRUE?
- 8. Jak renderować płynną ścieżkę, biorąc pod uwagę zestaw punktów danych?
- 9. Biorąc pod uwagę nazwę użytkownika i hasło, w jaki sposób podszywać się pod tego użytkownika?
- 10. Biorąc pod uwagę zakres dat, w jaki sposób możemy podzielić go na N przyległych pod-interwałów?
- 11. Jaka jest przydatność bloków CHECK, UNITCHECK i INIT w Perlu?
- 12. Znalezienie klucza w mapie, biorąc pod uwagę wartość
- 13. Znajdź plik jar, biorąc pod uwagę nazwę klasy?
- 14. Pierwsze wiersza i kolumny trójkątnej Matrix, biorąc pod uwagę Index
- 15. Otrzymasz aktualną datę, biorąc pod uwagę strefę czasową w PHP?
- 16. Jak zabić proces w Javie, biorąc pod uwagę konkretny PID
- 17. Biorąc pod uwagę PID dziecka, jak uzyskać rodzic PID
- 18. Excel VBA: Jak rozszerzyć zakres Biorąc pod uwagę bieżący Wybór
- 19. Jak wybrać tekst RichTextBox, biorąc pod uwagę indeks i długość
- 20. Jakiego rodzaju makro jest brane pod uwagę?
- 21. Czy foldRight jest odpowiednikiem foldLeft, biorąc pod uwagę nieprzyswajalną operację asocjacyjną?
- 22. Jak zrobić LIKE biorąc pod uwagę dwie kolumny?
- 23. Biorąc pod uwagę nazwę akcji htmlHelper +, jak określić nazwę kontrolera?
- 24. Biorąc pod uwagę rok, miesiąc i dzień, wszystko w int, w jaki sposób wygenerować NSDate
- 25. Szyny - Biorąc pod uwagę blok tekstu, auto-link links
- 26. mysqli_select_db() oczekuje parametr 1 za mysqli, biorąc pod uwagę ciąg
- 27. wyrażenie NSDictionaryResultType nie biorąc pod uwagę nowo wstawionych obiektów
- 28. Biorąc pod uwagę UTI (Uniform Type Identifier) znajdź wszystkie typy, do których jest on zgodny
- 29. Konwersja RGB do RGBA biorąc pod uwagę tło
- 30. Jak przekonwertować HttpRequestBase na HttpRequestMessage, biorąc pod uwagę nazwy nagłówków?
Bardzo często odpowiedzi dotyczące kodowania znaków w przepełnieniu stosu są częściowo lub całkowicie błędne lub autor odpowiedzi wyraźnie nie rozumie, a ślepy trafił na coś, co wygląda na to, że robi coś poprawnie, ale w rzeczywistości tak nie jest. Jest bardzo mało osób, które odpowiedziałyby na pytanie, czy to dobrze. – Esailija