2009-10-20 3 views
6

Circa 2 anni fa ho commesso l'errore di avviare un sito Web di grandi dimensioni utilizzando iso-8859-1. Ora sto avendo problemi con alcuni personaggi, specialmente quando invio dati al server usando ajax. Per questo motivo, vorrei passare a UTF-8.Codifica dei caratteri del sito web da iso-8859-1 a UTF-8

Quali problemi vedi provenire da questo? So che dovrei cercare nel sito per cercare i caratteri che devono essere modificati da un? ai loro veri personaggi. Ma ci sono altri rischi nel fare questo? Qualcuno l'ha già fatto prima?

risposta

7

La difficoltà principale è fare in modo di aver controllato che tutti i percorsi dati sono UTF-8 pulito:

  1. è il vostro sito DB-backed? Se è così, dovrai convertire tutte le tabelle in UTF-8 o qualche altra codifica Unicode, quindi l'ordinamento e la ricerca del testo funzioneranno correttamente.

  2. Il tuo sito utilizza un linguaggio di programmazione per i contenuti dinamici? (PHP, mod_perl, ASP ...?) Se è così, dovrai assicurarti che l'interprete di lingua che stai usando comprenda completamente qualche forma di Unicode, risolvendo le conversioni se non usa UTF-8 in modo nativo — UTF-16 è il successivo più comune — e controlla che sia configurato per utilizzare UTF-8 sul proprio output sul server web.

  3. Il tuo sito ha una sorta di server di applicazioni back-end? Usa UTF-8 per le sue uscite di testo?

  4. Ci sono almeno tre diversi posti in cui è possibile dichiarare il set di caratteri per un documento Web. Siate sicuri di loro tutto cambia:

    • HTTP Content-Type intestazione
    • il <meta http-equiv="Content-Type"> tag nel <head>
    • il tag ai tuoi documenti <?xml> nella parte superiore del documento, se si utilizza XHTML Strict

Tutto ciò deriva dalle mie esperienze di anni fa quando ho rintracciato alcuni dati Unicode tramite un'app N-tier moderatamente complessa e ho trovato catene rsion come:

Latin-1 → UTF-8 → Latin-1 → UTF-8 

Così, anche se i dati finirono nel browser affermando di essere "UTF-8", l'app potrebbe ancora gestire solo il sottoinsieme comune con Latin-1.

Il motivo principale per queste strane catene di conversione era dovuto al supporto immaturo Unicode negli strumenti in quel momento, ma è ancora possibile trovarsi a fare brutti scherzi come questo se non si fa attenzione a rendere pulita la tubazione UTF-8 .

Per quanto riguarda i commenti relativi alla ricerca di caratteri Latin-1 e alla conversione di file uno per uno, non lo farei. Costruirò uno script attorno all'utilità iconv trovata su ogni moderno sistema Linux, alimentando ogni file di testo nel tuo sistema, convertendolo esplicitamente da Latin-1 a UTF-8. Non lasciare nulla di intentato.

+0

Stiamo utilizzando un CMS, scritto in PHP che gestisce la codifica. È in esecuzione su PostgreSQL. Nel CMS, posso solo cambiare la codifica, che cambierà le intestazioni del tipo di contenuto in tutte le pagine ... –

+0

Scommetto che cambia solo il set di caratteri che il CMS dichiara di usare su mod_php, che controlla ciò che Apache riporta al browser. Certamente non mi aspetterei che possa migrare magicamente tutti i dati nel tuo DB. Probabilmente non convertirà i modelli esistenti che il CMS utilizza per creare pagine. Bottom line: test, test, test. Metti alcuni personaggi nel DB che provengono dall'esterno del set Latin-1 e vedi se sopravvivono al browser. Se è così, controlla di non avere conversioni ridondanti come ho mostrato sopra. In caso contrario, qualcosa sta ancora distruggendo UTF-8 in Latin-1. –

+0

Pensato a un'altra area di rischio. Aggiunto alla lista numerata sopra. –

2

Tale modifica tocca (quasi) ogni parte del sistema. Devi passare attraverso tutto, dal database al PHP all'HTML al browser web.

Avviare un sito di test e sottoporlo ad alcuni seri test (vari browser su varie piattaforme che fanno varie cose).

IMO è importante acquisire familiarità con UTF-8 e cosa significa per il software. Alcuni punti rapidi:

  • PHP è principalmente orientato ai byte. Scopri la differenza tra caratteri e punti e byte di codice, e tra UTF-8 e Unicode.
  • UTF-8 è ben progettato. Ad esempio, date due stringhe UTF-8, un strstr() orientato ai byte continuerà a funzionare correttamente.
  • Il problema più comune è il trattamento di una stringa UTF-8 come ISO-8859-1 e viceversa: potrebbe essere necessario aggiungere documentazione alle funzioni per indicare quale tipo di codifica si aspettano, per rendere meno probabile questo tipo di errori. Può anche essere d'aiuto una convenzione di denominazione variabile per le stringhe (per indicare quale codifica esse utilizzano).