使用Plack和Middlewares时,将默认perl的IO切换为utf-8是正确的吗?

时间:2012-06-13 09:40:16

标签: perl utf-8 plack

两个起点:

使用

是否正确
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

2 个答案:

答案 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;