两个起点:
- 在 his answer to Why does modern Perl avoid UTF-8 by default? tchrist 指出了确保 Perl 中正确处理 Unicode 所需的 52 件事。答案显示了带有一些
use
语句的样板代码。关于 Unicode 使用的类似问题是 How to make "use My::defaults" with modern perl & utf8 defaults? PSGI spec设计上是面向字节的。我有责任对所有内容进行编码/解码,因此对于 Plack 应用程序,正确的方法是对输出进行编码并对输入进行解码,例如:
use Encode; my $app = sub { my $output = encode_utf8( myapp() ); return [ 200, [ 'Content-Type' =>'text/plain' ], [ $str ] ]; };
使用是否正确
use uni::perl; # or any similar
在 PSGI 应用程序和/或我的模块中?
uni::perl
将 Perl 的默认 IO 更改为 UTF-8,因此:
use open qw(:std :utf8);
binmode(STDIN, ":utf8");
binmode(STDOUT, ":utf8");
binmode(STDERR, ":utf8");
这样做会破坏 Plack 或其中间件中的某些内容吗?或者是为 Plack 在打开时显式编码/解码编写应用程序的唯一正确方法,因此无需 open
pragma ?
最佳答案
您确实不想在 Plack 上默认将 STDIN
/STDOUT
设置为 UTF-8 模式,因为您不知道它们是否会这样做是二进制数据传输。例如。如果这些文件句柄是 FastCGI 协议(protocol)连接器,它们将携带编码的二进制结构而不是 UTF-8 文本。因此,它们不得定义编码层,否则这些二进制结构将被破坏或被拒绝为无效。
关于perl - 使用 Plack 和 Middlewares 时将默认 perl 的 IO 切换为 utf-8 是否正确?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11012155/