什么可能导致perl cgi脚本错误地将发布的表单数据解释为UTF-8编码?

时间:2017-02-16 12:41:31

标签: perl utf-8 cgi

我正在研究导致Perl CGI脚本向数据库写入错误值的错误的原因。

此perl脚本从另一个明确使用ISO-8859-1编码的系统(不是浏览器)接收数据。写入数据库的错误数据如下所示:

Gro�Gr�nF�rbung�sterreich

什么时候应该

GroßGrünFärbungÖsterreich

我发现我可以通过修改脚本来使用decode('utf8', $xyz)而不是$xyz来创建错误的数据库条目。所以我的问题是:是否有任何影响,例如HTTP标头,环境变量,配置文件等可能导致perl CGI模块隐含地执行此操作decode

原始源代码:

my $ack = new CGI;
my $xyz = $ack->param( 'xyz' );

在某些情况下显然表现得像:

use Encode qw(decode encode);
my $ack = new CGI;
my $xyz = decode('utf8',$ack->param( 'xyz' ));

1 个答案:

答案 0 :(得分:2)

您应该将来自perl程序本身之外的所有数据作为原始数据字节(八位字节)处理。如果您使用假定的编码明确地decode,请使用perl(以其原始格式)处理它,并encode使用您希望的编码将其放在程序之外(就像在您的情况下一样)数据库),你是安全的。正如你所看到的,其他一切都可能出错。

使用句柄(如文件或套接字)时,您可以使用PerlIO图层执行此操作,因此您不必明确使用解码/编码。