2009-11-25 8 views
7

Fino ad ora, il progetto in cui lavoro ASCII utilizzato solo nel codice sorgente. A causa di diversi cambiamenti imminenti nella zona I18N e anche perché abbiamo bisogno di alcune stringhe Unicode nei nostri test, stiamo pensando di mordere la pallottola e spostare il codice sorgente per UTF-8, mentre si utilizza il utf8 pragma (use utf8;)Quali problemi devo aspettarmi quando spostiamo il codice Perl legacy in UTF-8?

Dal il codice è in ASCII ora, non mi aspetto di avere problemi con il codice stesso. Tuttavia, non sono a conoscenza di eventuali effetti collaterali che potremmo ottenere, mentre penso che sia abbastanza probabile che ne otterrò alcuni, considerando il nostro ambiente (perl5.8.8, Apache2, mod_perl, MSSQL Server con il driver FreeTDS).

Se si sono compiute tali migrazioni in passato: quali problemi posso aspettarmi? Come posso gestirli?

+0

Quando cambio il mio codice sorgente dalla codifica di default del sistema "GB2312" a "UTF8" e applicare l'uso utf8 pragma, il codice non sarà più in grado di aprire i file il cui nome sono codificati in GB2312. – Mike

risposta

4

Alcuni anni fa ho spostato la nostra piattaforma mod_perl interna (~ 35k LOC) in UTF-8. Ecco le cose che abbiamo dovuto considerare/modificare:

  • nonostante il perl consiglio di 'solo dove necessario', usare 'utf8;' in ogni file sorgente: ti dà consistenza.
  • convertire il database in UTF-8 e assicurare il vostro config DB imposta il set di caratteri di connessione a UTF-8 (in MySQL, guardare fuori per problemi di lunghezza campo con VARCHAR quando si fa questo)
  • utilizzare una versione recente di DBI - anziani versioni non impostate correttamente la bandiera utf8 su scalari restituiti
  • utilizzare il modulo Encode, evitare di utilizzare perl di funzioni incorporate in utf8 a meno che non si sa esattamente quali dati hai a che fare con
  • durante la lettura UTF-8 file, specificare il layer - open($fh,"<:utf8",$filename)
  • su un sistema operativo in stile RedHat (anche nelle versioni 2008) le librerie incluse non saranno in grado di leggere i file XML memorizzati negli scalari utf8 - aggiornare perl o usare semplicemente il livello :raw
  • in vecchi perls (anche nelle versioni 5.8.x) alcune vecchie funzioni di stringa possono essere imprevedibili - es. $b=substr(lc($utf8string),0,2048) fallisce casualmente ma funziona $a=lc($utf8string);$b=substr($a,0,2048)!
  • ricorda di convertire il tuo input - es.in una web app, dati dei moduli in entrata possono avere bisogno di decodifica
  • assicurare tutto il personale dev sapere da che parte intorno ai termini di codifica/decodifica sono - un 'stringa utf8' in Perl è in/de forma/-coded, una stringa di byte grezzo containg dati utf8 è/it/-coded
  • gestire gli URL correttamente -/it/-code una stringa utf8 in byte e poi fare la codifica% xx per produrre la forma ASCII del URL e/de/-Code quando leggendolo da mod_perl (es. $uri=utf_decode($r->uri()))
  • un altro per le applicazioni web, ricordare il charset nell'intestazione HTTP ignora il set di caratteri specificato con <meta>
  • sono sicuro che questo va da sé - se si fa alcuna operazione di byte (ad esempio, dati a pacchetto, ope bit a bit razioni, anche un Content-Length intestazione MIME) assicurarsi che si sta calcolando con byte e non caratteri
  • assicurarsi che gli sviluppatori sanno come garantire loro editor di testo sono impostati su UTF-8, anche se non c'è BOM su un dato file
  • ricordarsi di assicurarsi che il sistema di controllo delle revisioni (per Google beneficio - subversion/svn) sarà gestire correttamente i file
  • , ove possibile, il bastone di ASCII per i nomi di file e nomi di variabili - questo evita problemi di portabilità quando si muove il codice intorno o utilizzando diversi dev tools

Un altro - questa è la regola d'oro - non solo hackerare til funziona, assicuratevi di comprendere appieno ciò che sta accadendo in una determinata en/decodifica situazione!

Sono sicuro che la maggior parte di questi è già stata risolta, ma spero che tutto ciò aiuti qualcuno a evitare le molte ore di debug che abbiamo affrontato.

11

Il pragma utf8 indica semplicemente a Perl che il codice sorgente è codificato in UTF-8. Se hai usato ASCII solo nella tua sorgente, non avrai alcun problema con Perl capendo il codice sorgente. Potresti voler creare un ramo nel tuo controllo sorgente solo per essere sicuro. :)

Se è necessario gestire i dati UTF-8 dai file o scrivere UTF-8 in file, è necessario impostare le codifiche sui filehandle e codificare i dati come previsto dai bit esterni. Si veda, ad esempio, With a utf8-encoded Perl script, can it open a filename encoded as GB2312?.

Controllare la documentazione Perl che vi racconta Unicode:

vedere anche Juerd's Perl Unicode Advice.

Problemi correlati