2012-06-13 14 views
6

due punti di partenza:È corretto cambiare l'IO di Perl predefinito in utf-8 mentre si usano Plack e Middlewares?

  • In his answer to Why does modern Perl avoid UTF-8 by default? tchrist sottolineato 52 cose necessarie per assicurare la corretta movimentazione Unicode in Perl. La risposta mostra il codice boilerplate con alcune dichiarazioni use. Una domanda simile sull'uso di Unicode è How to make "use My::defaults" with modern perl & utf8 defaults?
  • Il PSGI spec è di progettazione orientata ai byte. E 'mia responsabilità di codificare/decodificare tutto, quindi per il Plack applicazioni il modo corretto è quello di codificare l'uscita e decodificare di input, ad esempio:

    use Encode; 
    my $app = sub { 
        my $output = encode_utf8(myapp()); 
        return [ 200, [ 'Content-Type' =>'text/plain' ], [ $str ] ]; 
    }; 
    

È corretto utilizzare

use uni::perl; # or any similar 

nell'applicazione PSGI e/o nei miei moduli?

uni::perl cambia di default di Perl IO a UTF-8, quindi:

use open qw(:std :utf8); 
binmode(STDIN, ":utf8"); 
binmode(STDOUT, ":utf8"); 
binmode(STDERR, ":utf8"); 

Will farlo rompere qualcosa in Plack o dei suoi middleware? O è l'unico modo corretto per scrivere app per Plack che codificano/decodificano esplicitamente all'apertura, quindi senza lo open pragma?

+1

Does Plack scrive in STDOUT o legge da STDIN? Se è così, è quasi sicuramente sbagliato (a meno che non siano anche un bug in Plack). Ho detto "quasi" perché l'uso di 'binmode' in Plack non lo farebbe. PS - ora sai perché non è fatto di default; rompe cose. – ikegami

+0

Sono speranzoso che il guruan di @miyagawa dirà di più .. :) E capisco perché utf8 non è predefinito, ma, (IMO) i nuovi moduli CPAN dovrebbero essere sviluppati con "perl -CSDA" o con 'env PERL_UNICODE' in mente. E miyagawa sicuramente lo usa in ambiente giapponese, quindi, dovrebbe sapere nel modo giusto ..;) – cajwine

+0

Penso che il "modo corretto" che hai elencato sia rotto. 'text/plain' ha bisogno di un charset in modo che l'altra parte sappia cosa rappresentano i byte e come decodificarli. – Ashley

risposta

2

In realtà non si desidera impostare STDIN/STDOUT in modo UTF-8 per impostazione predefinita su Plack, perché non si sa ad esempio se saranno i trasporti di dati binari. Per esempio. se questi filehandle sono il connettore del protocollo FastCGI, porteranno strutture binarie codificate e non testo UTF-8. Pertanto, non devono avere uno strato di codifica definito, o quelle strutture binarie verranno storpiate o rifiutate come non valide.

-1

Sui moderni sistemi GNU/Linux, è necessario passare a UTF-8 a livello globale. Ciò implica l'introduzione

LANG="xx_YY.UTF-8" 
PERL_UNICODE=SDAL 
PERL5OPT=-Mutf8 

nel vostro /etc/environment o /etc/sysconfig/i18n o /etc/default/locale o qualunque sia il vostro file di configurazione del sistema è. A causa di RHEL/Centos bug ho collegato un collegamento simbolico /etc/environment a sysconfig/i18n.

script che si basano su ingresso binario deve impostare binmode su STDIN/OUT/ERR (?) O use open pragma o possano essere chiamati con -C0 opzione.

Il problema è che alcuni driver DBD sono bacati, ad es. DBD::JDBC, ed è necessario impostare manualmente la flag utf8.

use Encode qw/_utf8_on/; 
map { _utf8_on $_; } @strings; 
Problemi correlati