2012-06-11 17 views
5

Ho un problema con la codifica del char in yii. Se creo una nuova webapp:Errore con utf8 caratteri e htmlspecialchars in yii

./Yii-framework/framework/yiic webapp MyTest 

Poi vai a /protected/views/layouts/main.php e cambiare il piè di pagina a un testo con un carattere utf8, per esempio

<div id="footer"> 
     Cópyrîgth <br /> 
</div> 

Refresh la pagina e tutto è ok. Bello! ;)

E poi provo ad accedere con un carattere utf8 il nome utente, ad esempio Admin, si blocca dicendo:

Error 500 

htmlspecialchars(): Invalid multibyte sequence in argument 

così ho controllato questo articolo su unicode in yii

e poi sono andato a /protected/config/main.php e ha aggiunto questa linea alla partenza:

header('Content-Type: text/html; charset=utf-8'); 

Nuovo tentativo lo stesso login di nuovo funziona (non va in crash), ma ora il piè di pagina è rotto e mostra:

C�pyr�ght 

Ho provato altre combinazioni, come spiegato nell'articolo "Unicode in Yii" ma nessuno di loro fanno funzionare entrambe le cose allo stesso tempo.

Qualche idea per risolvere questo problema?

Nota: non riesco a passare al file php.ini.

Ho anche provato il AddDefaultCharset UTF-8 opzione nel file .htaccess e metterlo nella cartella in/MyTest/è che la cartella corretta di cui nell'articolo come: il tuo DocumentRoot?

Grazie

+0

Sto avendo lo stesso problema. Hai mai trovato una soluzione? – coderama

+0

quei punti interrogativi sono il risultato di sequenze di byte UTF-8 non valide. Molto probabilmente stai usando un editor che ha salvato il testo in una codifica a byte singolo, ad esempio, [ISO 8859-1] (http://en.wikipedia.org/wiki/ISO/IEC_8859-1). In tutte le codifiche a byte singolo che sono estensioni di ASCII, la parte estesa ha valori di byte> = 128. Tutti i caratteri a byte singolo di UTF-8 sono <128, tutti i caratteri multibyte sono byte> = 128. Questo è il motivo I caratteri ISO 8859-x con segni diacritici diventano punti interrogativi: non potrebbero mai essere UTF-8 validi, salvo in combinazioni abbastanza improbabili. –

risposta

6

io non sono affatto familiarità con Yii, ma, se si desidera incollare caratteri unicode letterali in un file, è necessario assicurarsi che il vostro editor di testo salva il file utilizzando una codifica Unicode, come utf8. Prova utf8, senza un BOM.

La mia esperienza è che gli editor di testo si comportano in modo strano quando si modifica l'impostazione di codifica e sono già presenti caratteri codificati. Basta ricominciare con un nuovo file, cambiare la codifica, quindi incollare i caratteri.

+0

"l'uso di una codifica Unicode, come utf8" non è un buon consiglio, dovrebbe essere "l'uso della codifica Unicode UTF-8". Altre codifiche [Unicode] (http://en.wikipedia.org/wiki/Unicode) non sono consigliate per il web. E la [BOM] (http://en.wikipedia.org/wiki/Byte_order_mark) (marchio di ordine dei byte) non ha molto senso in UTF-8, la maggior parte degli editor non considera questa opzione per UTF-8 (correttamente). –

+0

Devo correggermi: a quanto pare c'è anche un esempio di un editor che ** non ** è in grado di salvare un file con codifica UTF-8 ** senza ** un BOM: il Blocco note di Microsoft. Gli utenti di Windows che non vogliono usare l'editor di IDE possono comunque usare Notepad ++, che è gratuito e molto user friendly. –

2

Per prima cosa, dovresti rimuovere la chiamata di intestazione nel file main.php, potrebbe creare problemi per te in futuro.

In secondo luogo, vorrei fare quello che suggeriva rambo coder e assicurarmi che i file vengano salvati come UTF8 nell'editor.

+0

come potrebbe la chiamata dell'intestazione creare problemi in futuro ??? –

1

Le soluzioni di cui sopra sembrano essere le giuste poiché Yii non ha davvero un problema con gli unicodes ma potresti anche eseguire alcuni controlli aggiuntivi come il set di caratteri all'interno del meta tag nella pagina Html è impostato su utf-8 e invece di scrivendo plain html puoi usare Chtml :: encode (Copyright) in modo che yii possa gestire la codifica. Per la parte username, assicurati che anche Charset di default nel tuo database sia impostato su utf8.

0

Il miglior modo per aggirare questo è quello di utilizzare http://www.utexas.edu/learn/html/spchar.html - nel vostro caso C ó pyr î lotta sarebbe appare come C&#243;pyr&#238;ght

Inoltre, aggiungo nell'HTML <meta charset="utf-8"> per assicurarmi che i browser si comportino da soli.

+1

Sicuramente il modo migliore, nel sistema di setup correttamente, non è necessario codificare i caratteri in entità html. –

+0

Non merita un downvote, perché anche se non tecnicamente corretto, questa è un'opzione che sono lieto di sapere. – coderama

+0

"best way AROUND this" significa bypassare tutte le complicazioni UTF8, esp. true quando si lavora con caratteri multibyte e si vede mostrare per user-agent (browser) con set di caratteri diversi. –

3

Prima di tutto, è necessario capire che un personaggio con un segno diacritico come ó o î (dal tuo esempio) non è automaticamente un "carattere utf-8". È semplicemente un personaggio che ha diverse codifiche (se ce ne sono) in set di caratteri diversi, anche in quei set di caratteri che hanno in comune la parte ASCII single-byte di base (cioè l'alfabeto inglese, le cifre, la punteggiatura più comune, e un po 'di più). Potresti chiamarlo un "personaggio problematico", ma non un "carattere utf-8".

Quindi, quando hai scritto il footer <div>, NON lo hai scritto codificato in UTF-8. Il tuo editor ha salvato quei caratteri in una codifica a byte singolo, come ISO 8859-1 o uno dei suoi parenti.

I browser normalmente rilevano automaticamente la codifica utilizzata in una pagina, se non è specificata. Questo è il motivo per cui inizialmente eri in grado di vedere nel browser esattamente ciò che avevi scritto nel tuo editor.

Quindi si è tentato di accedere con un "carattere problematico" nel nome utente. Il browser ha interpretato la tua pagina come una codifica a byte singolo, quindi questo ha causato la codifica dell'input del modulo nello stesso modo e l'invio di codifica a byte singolo al server. Il codice PHP non è stato scritto pensando a questa possibilità, apparentemente, perché non ha impostato correttamente il terzo parametro di htmlspecialchars(), che è "UTF-8" per impostazione predefinita (a partire da PHP 5.4.0 - era "ISO-8859-1" prima). Poiché una stringa codificata a byte singolo con "caratteri problematici" non è quasi mai una stringa UTF-8 valida (vedere il mio commento alla domanda, è il secondo commento), htmlspecialchars() lo ha respinto.

Quindi è stato aggiunto correttamente lo header('Content-Type: text/html; charset=utf-8');, che ha disabilitato il rilevamento del set di caratteri automatico dal browser. A questo punto è diventato evidente che il tuo file con il footer <div> non era codificato in UTF-8 (vedi di nuovo il mio commento per la spiegazione dei punti interrogativi che appaiono al posto dei "caratteri problematici").

Quindi tutto ciò che resta da fare è convincere il tuo editore a salvare i file codificati in UTF-8. Come altri hanno notato, il salvataggio del file in una codifica diversa non funziona in tutti gli editor. A partire da un nuovo file a volte è la soluzione, forse dopo aver impostato la codifica predefinita del tuo editor su UTF-8.

Per verificare la codifica, è possibile utilizzare il comando file in una shell. La sua uscita dovrebbe essere qualcosa di simile

main.php: PHP script, UTF-8 Unicode text 

Oppure, è possibile utilizzare il comando od -tx1z, che scarica il file (forse | less), come una sequenza di byte esadecimali con la stringa corrispondente sul lato. Se il file è codificato a byte singolo, i "caratteri problematici" saranno byte singoli> = 0x80. Se è codificato in UTF-8, saranno sequenze di 2 byte (altri saranno 3 o più byte), tutti> = 0x80, mentre i "caratteri non problematici" continueranno a essere singoli byte < 0x80.

L'articolo che citi sembra essere ben scritto, basta seguirlo.

non ti servono la direttiva AddDefaultCharset nel file .htaccess, però, se tutte le pagine sono generate con l'intestazione Content-Type: text/html; charset=utf-8 HTTP, perché l'effetto della direttiva Apache è esattamente lo stesso (ed è bene tenere il controllo sulla codifica all'interno di PHP).

L'aggiunta dello <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/> ha lo stesso effetto, per il browser, dell'intestazione HTTP di cui sopra (si noti l'http equiv). L'intestazione HTTP è più pulita, ma questo meta tag aggiuntivo può essere d'aiuto nel caso in cui una pagina venga salvata senza le informazioni dell'intestazione.

Soprattutto, non aver paura di UTF-8, perché è tuo amico!

(... ma, dalla risposta che ha ottenuto la vostra generosità, vedo che tu, come molte persone, continua a pensare che la comprensione codifiche dei caratteri è troppo difficile per voi ☹)

+0

+10 per una risposta completa e una faccia triste alla fine che è in utf –

0

ho avuto anche questo problema - in particolare quando stavo cercando di visualizzare il testo di utf da db. Ho cambiato tutte le colazioni e i tipi in mysql in utf8-bin - ma ancora nessun amore ... poi ho provato a modificare tutti i miei layout e viste con i meta tag ecc ... diavolo, ho persino guardato l'origine dei siti giapponesi codice e incollato quella roba in ... NULLA LAVORATO _ ... FINO A ... ho trovato QUESTO post: Yii And UTF8 Display, UTF8 works with mysqli but not yii backend Risulta, è necessario tweek un'impostazione nel mio main.php nel file di configurazione, sotto componenti .. f

Problemi correlati