两个起点:
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的应用程序的唯一正确方法,所以没有open
pragma?
答案 0 :(得分:2)
你真的不想在Plack上默认将STDIN
/ STDOUT
设置为UTF-8模式,因为你不知道它们是否是二进制数据传输。例如。如果那些文件句柄是FastCGI协议连接器,它们将携带编码的二进制结构而不是UTF-8文本。因此,它们不能定义编码层,否则这些二进制结构将被修改或拒绝为无效。
答案 1 :(得分:-2)
在现代GNU / Linux系统上,您应该全局切换到UTF-8。这意味着设置
LANG="xx_YY.UTF-8"
PERL_UNICODE=SDAL
PERL5OPT=-Mutf8
在/etc/environment
或/etc/sysconfig/i18n
或/etc/default/locale
或您的系统配置文件中。由于RHEL/Centos bug我将/etc/environment
符号链接到sysconfig/i18n
。
依赖于二进制输入的脚本应在STDIN / OUT / ERR(?)或binmode
pragma上设置use open
,或者应使用-C0
选项调用。
问题是某些DBD
司机有问题,例如DBD::JDBC,您必须手动设置utf8标志。
use Encode qw/_utf8_on/;
map { _utf8_on $_; } @strings;