2012-03-22 8 views
9

Jestem zdezorientowany co do zachowania utf8_decode() i po prostu chcę trochę wyjaśnienia. Mam nadzieję, że wszystko w porządku.Mój skrypt działa dobrze, ale jestem zdezorientowany, dlaczego muszę używać utf8_decode()

Oto prosty formularz HTML, który używam do przechwytywania jakiś tekst i zapisać go do mojej bazy danych MySQL (który używa sortowania utf8_general_ci):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html> 
<head> 
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
</head> 
<body> 
<form action="update.php" method="post" accept-charset="utf-8"> 
<p> 
    Title: <input type="text" name="title" id="title" accept-charset="utf-8" size="75" value="" /> 
</p> 
<p> 
    <input type="submit" name="submit" value="Submit" /> 
</p> 
</form> 
</body> 
</html> 

Jak widać mam ten Coded za pomocą charset = utf8 w odpowiednich miejscach. Akceptujemy tekst zawierający znaki diakrytyczne (np., Ñ, ó itp.). Na koniec uruchamiamy mały skrypt na wszystkich wejściach tekstowych, aby sprawdzić znaki diakrytyczne i zmienić je na elementy HTML (np., Ñ staje się & ntilde;).

Po otrzymaniu danych wejściowych przez mój skrypt, najpierw muszę wykonać utf8_decode (wejście $), a następnie uruchomić mój mały skrypt, aby sprawdzić i zmienić znaki diakrytyczne w razie potrzeby. Wszystko dziala. Jestem ciekawy, dlaczego muszę uruchomić dekodowanie tego wejścia. Rozumiem, że utf8_decode konwertuje ciąg zakodowany w UTF-8 na ISO-8859-1. Chcę się upewnić - , mimo że wszystko działa dobrze (tak mi się wydaje) - że nie robię czegoś, co może mnie dogonić później. Na przykład, że wysyłam zakodowane znaki ISO-8859-1 do przechowywania w mojej bazie danych, która jest skonfigurowana do przechowywania/podawania znaków UTF-8. Czy powinienem zrobić coś takiego, jak uruchomić utf8_encode() na łańcuchu, który zwraca mój skrypt diakrytyczny do elementów? Np .:

$string = utf8_decode($string); 
$search = explode(",","À,È,Ì,Ò,Ù,à,è,ì,ò,ù,Á,É,Í,Ó,Ú,Ý,á,é,í,ó,ú,ý,Â,Ê,Î,Ô,Û,â,ê,î,ô,û,Ã,Ñ,Õ,ã,ñ,õ,Ä,Ë,Ï,Ö,Ü,Ÿ,ä,ë,ï,ö,ü,ÿ,Å,å,Æ,æ,ß,Þ,þ,ç,Ç,Œ,œ,Ð,ð,Ø,ø,§,Š,š,µ,¢,£,¥,€,¤,ƒ,¡,¿"); 
$replace = explode(",","&Agrave;,&Egrave;,&Igrave;,&Ograve;,&Ugrave;,&agrave;,&egrave;,&igrave;,&ograve;,&ugrave;,&Aacute;,&Eacute;,&Iacute;,&Oacute;,&Uacute;,&Yacute;,&aacute;,&eacute;,&iacute;,&oacute;,&uacute;,&yacute;,&Acirc;,&Ecirc;,&Icirc;,&Ocirc;,&Ucirc;,&acirc;,&ecirc;,&icirc;,&ocirc;,&ucirc;,&Atilde;,Ntilde;,&Otilde;,&atilde;,&ntilde;,&otilde;,&Auml;,&Euml;,&Iuml;,&Ouml;,&Uuml;,&Yuml;,&auml;,&euml;,&iuml;,&ouml;,&uuml;,&yuml;,&Aring;,&aring;,&AElig;,&aelig;,&szlig;,&THORN;,&thorn;,&ccedil;,&Ccedil;,&OElig;,&oelig;,&ETH;,&eth;,&Oslash;,&oslash;,&sect;,&Scaron;,&scaron;,&micro;&cent;,&pound;,&yen;,&euro;,&curren;,&fnof;,&iexcl;,&iquest;"); 
$new_input = str_replace($search, $replace, $string); 
return utf8_encode($new_input); // right now i just return $new_input. 

Doceń każdy wgląd, jaki ktoś ma do zaoferowania na ten temat.

+5

+1 za nieprzyznanie "działa" być wystarczająco dobrym – bernie

Odpowiedz

0

Po przesłaniu formularza z accept-charset = "utf-8" przeglądarka wysyła dane formularza na serwer w postaci ISO-8859-1 zakodowanej za pomocą utf-8. utf8_decode przekształca zakodowane dane w ścisłe ISO-8859-1. Na przykład, jeśli prześlesz "ñ", kodowanie utf-8 prześle "% F1" do działania formularza, które z kolei musi zostać przekonwertowane z powrotem na "ñ", aby skrypt działał.

0

tak dostanie stronę wyświetlającą tekst do wyświetlenia w utf-8, ale nawet jeśli przełączysz go na utf8 używając accept-charset = "utf-8" serwer koncertuje go do iso-8859-1, a następnie kiedy jest wyświetlany, to konwertuje się ponownie do utf-8 z iso-8859-1, ale był w stanie przekonwertować tylko znak UTF-8, więc kończy się wyświetlając dziwny znak i za każdym razem, gdy przejdziesz przez ten proces, otrzymasz Gorzej i gorzej, więc to, co znalazłem, mimo że robisz wszystko po stronie html, nie ma sposobu na przełączenie go na serwerze, aby mógł odczytać utf-8, a więc nie możesz przełączyć wszystkiego na utf- 8. To dotyczy Apache i jeśli jest sposób, który chciałbym poznać.

1

Nie należy używać "accept-charset". Jest uszkodzony. Większość przeglądarek przestała wysyłać je we własnych żądaniach http. Niektóre przeglądarki (IE) całkowicie ignorują ten atrybut podczas analizowania formularza, a inne wykonują bardzo ograniczoną pracę. W praktyce "zestaw znaków akceptujących" wyrządzi więcej szkód niż pożytku.

Konwencja jest taka, że ​​przeglądarka wyśle ​​dane w tym samym kodowaniu, w jakim otrzymała formularz. Upewnij się, że twoja strona jest wysyłana jako UTF-8. Twój metatag w kodzie HTML to za mało. W przypadku strony PHP to ustawienie można ustawić w 3 miejscach:

  • Znacznik HTML <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> w "nagłówku".
  • Linia AddDefautCharset UTF8 w konfiguracji Apache (lub coś podobnego na innych serwerach internetowych).
  • Wywołanie PHP do header("Content-type=text/html; charset=utf-8"); (zanim cokolwiek zostanie wyświetlone na stronie).

Każda dyrektywa zastępuje poprzednie. Więc jeśli twój serwer już zadeklaruje zestaw znaków, twój metatag zostanie zignorowany.

Więc należy:

  • Upewnij się, że plik źródłowy jest w UTF-8, oczywiście.
  • Napraw źródło HTML tak, aby sprawdzało się na W3C. Na przykład twój metatag powinien zostać zamknięty w XHTML.
  • Usuń atrybuty "accept-charset".
  • W końcu wymuś deklarację kodowania w Apache lub w PHP header().
  • Upewnij się w przeglądarce, że nagłówki HTTP odebrane z serwera mają zadeklarowane odpowiednie kodowanie (lub brak kodowania, jeśli polegasz na swoim metatagu). W systemie Linux curl -I <URL> są wyświetlane tylko nagłówki HTTP.
Powiązane problemy