2012-06-13 10 views
6

dos puntos de partida:¿Es correcto cambiar el IO de Perl predeterminado a utf-8 mientras usa Plack y Middlewares?

  • En his answer to Why does modern Perl avoid UTF-8 by default? tchrist señalaron 52 cosas necesarias para asegurar la correcta manipulación de Unicode en Perl. La respuesta muestra el código repetitivo con algunas declaraciones use. Una pregunta similar sobre el uso de Unicode es How to make "use My::defaults" with modern perl & utf8 defaults?
  • La PSGI spec está orientada por byte de diseño. Es mi responsabilidad para codificar/decodificar todo, así que para el Plack aplicaciones de la forma correcta es codificar la salida y decodificar entrada, por ejemplo:

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

¿Es correcto utilizar

use uni::perl; # or any similar 

en la aplicación PSGI y/o en mis módulos?

uni::perl cambia por defecto de Perl IO a UTF-8, por lo tanto:

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

Will hacerlo romper algo en Plack o sus middleware? ¿O es la única forma correcta de escribir aplicaciones para que Plack explícitamente codifique/descodifique en abierto, sin el open pragma?

+1

¿Plack escribe en STDOUT o lee en STDIN? Si es así, es casi seguro que está mal (a menos que también sean un error en Plack). Dije "casi" porque el uso de 'binmode' en Plack haría que no le importara. PD: ahora sabes por qué no está hecho por defecto; rompe cosas. – ikegami

+0

Tengo la esperanza de que @miyagawa gurusan diga más ... :) Y entiendo por qué utf8 no es el predeterminado, pero (IMO) los nuevos módulos de CPAN deben desarrollarse con "perl -CSDA" o con "env PERL_UNICODE" en mente. Y miyagawa seguro lo usa en el entorno de Japón, por lo tanto, debe saber el camino correcto ...;) – cajwine

+0

Creo que la "forma correcta" que enumera está rota. 'text/plain' necesita un juego de caracteres para que el otro lado sepa qué representan los bytes y cómo decodificarlos. – Ashley

Respuesta

2

Realmente no desea configurar STDIN/STDOUT para que sea modo UTF-8 por defecto en Plack, porque no sabe por ejemplo si serán transportes de datos binarios. P.ej. si esos manejadores de archivos son el conector de protocolo FastCGI, llevarán estructuras binarias codificadas y no texto UTF-8. Por lo tanto, no deben tener una capa de codificación definida, o esas estructuras binarias serán mutiladas o rechazadas por no ser válidas.

-1

En los modernos sistemas GNU/Linux debe cambiar completamente a UTF-8 a nivel mundial. Esto significa establecer

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

en su /etc/environment o /etc/sysconfig/i18n o /etc/default/locale o lo que su archivo de configuración del sistema es. Debido a RHEL/Centos bug, me vinculé /etc/environment a sysconfig/i18n.

secuencias de comandos que se basan en la entrada binaria debe establecer binmode en stdin/OUT/ERR (?) O use open Pragma o deberían llamarse con -C0 opción.

El problema es que algunos controladores DBD tienen errores, p. DBD::JDBC, y debe establecer la bandera utf8 a mano.

use Encode qw/_utf8_on/; 
map { _utf8_on $_; } @strings; 
Cuestiones relacionadas