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?
¿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
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
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