2012-03-22 14 views
9

Sono confuso circa il comportamento di utf8_decode() e voglio solo un piccolo chiarimento. Spero che sia ok.Il mio script funziona bene, ma sono confuso sul motivo per cui devo usare utf8_decode()

Ecco un semplice modulo HTML che sto usando per catturare un po 'di testo e salvarlo al mio database MySQL (che utilizza le regole di confronto 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> 

Come potete vedere ho questo Coded con charset = utf8 nei luoghi appropriati. Accettiamo testi che includono segni diacritici (ad es., Ñ, ó, ecc.). Alla fine, eseguiamo un piccolo script su tutto l'input di testo per controllare i segni diacritici e cambiarli in entità HTML (ad es., Diventa & ntilde;).

Quando l'input viene ricevuto dal mio script, prima devo fare utf8_decode ($ input) e poi eseguire il mio piccolo script per verificare e modificare i segni diacritici secondo necessità. Tutto funziona bene Sono curioso di sapere perché devo eseguire la decodifica su questo input. Comprendo che utf8_decode converte una stringa codificata in UTF-8 in ISO-8859-1. Voglio assicurarmi - anche se tutto funziona bene (o almeno così penso) - che non sto facendo qualcosa di matto che mi raggiungerà più tardi. Ad esempio, sto inviando caratteri codificati ISO-8859-1 per essere memorizzati nel mio database che è impostato per memorizzare/servire caratteri UTF-8. Dovrei fare qualcosa come eseguire utf8_encode() sulla stringa restituita dallo script diacritics-to-entities? Ad esempio:

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

Apprezzare qualsiasi opinione che qualcuno ha da offrire su questo.

+5

+1 per non lasciare che "funzioni" essere abbastanza buono – bernie

risposta

0

Quando si invia un modulo con accept-charset = "utf-8", il browser invia i dati del modulo al server in caratteri ISO-8859-1 codificati con utf-8. utf8_decode trasforma il codice dati codificato in rigoroso ISO-8859-1. Ad esempio, se si invia "ñ", la codifica utf-8 invierà "% F1" all'azione del modulo, che a sua volta deve essere riconvertita in "ñ" perché lo script funzioni.

0

in modo da ottenere la pagina per visualizzare il testo da visualizzare in utf-8, ma anche se si passa a utf8 utilizzando accept-charset = "utf-8" il server lo esegue in iso-8859-1 e quindi quando viene visualizzato, converte nuovamente in utf-8 da iso-8859-1, ma è stato in grado di convertire un solo char ut-8, quindi finisce con la visualizzazione di un carattere strano e ogni volta che si esegue il ciclo di questo processo si otterrà peggio e peggio, quindi quello che ho trovato è anche se si fa tutto sul lato HTML non c'è un modo per accenderlo sul server per poter leggere utf-8 e quindi non è possibile passare tutto a utf- 8. Questo è su apache e se c'è un modo che mi piacerebbe sapere.

1

Non utilizzare "accept-charset". È rotto. La maggior parte dei browser ha smesso di inviarlo nelle proprie richieste http. Alcuni browser (IE) ignorano completamente questo attributo quando analizzano un modulo e altri ne fanno un lavoro molto limitato. In pratica, il "accept-charset" farà più male che bene.

La convenzione prevede che il browser invii i dati nella stessa codifica in cui ha ricevuto il modulo. Assicurati quindi che la tua pagina sia inviata come UTF-8. Il tuo meta-tag nella testa HTML non è abbastanza. Per una pagina PHP, questa impostazione può essere impostato in 3 posti:

  • Un tag HTML <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> nella "testa".
  • Una riga AddDefautCharset UTF8 nella configurazione di Apache (o qualcosa di simile in altri server Web).
  • Una chiamata PHP a header("Content-type=text/html; charset=utf-8"); (prima che qualcosa venga visualizzato sulla pagina).

Ogni direttiva ha la precedenza su quelle precedenti. Quindi se il tuo server dichiara già un set di caratteri, il tuo meta tag verrà ignorato.

Così si dovrebbe:

  • Assicurarsi che il file di origine è in UTF-8, naturalmente.
  • Risolvi il codice sorgente HTML in modo che venga convalidato al W3C. Ad esempio, il tuo meta tag dovrebbe essere chiuso in XHTML.
  • Rimuovere gli attributi "accept-charset".
  • Infine, forzare la dichiarazione di codifica in Apache o PHP di header().
  • Garantire nel tuo browser che le intestazioni HTTP ricevuti dal server hanno la codifica giusta dichiarato (o nessuna codifica se si basano sulla vostra meta tag). Su Linux curl -I <URL> visualizza solo le intestazioni HTTP.
Problemi correlati