2013-04-06 7 views
5

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?

+2

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

Odpowiedz

9

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.

+0

Co z tym standardem: http://www.w3.org/International/O-HTTP-charset.en.php? To nie jest przydatne? –

+0

@ 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

+0

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. –