我正在研究导致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' ));
答案 0 :(得分:2)
您应该将来自perl程序本身之外的所有数据作为原始数据字节(八位字节)处理。如果您使用假定的编码明确地decode
,请使用perl(以其原始格式)处理它,并encode
使用您希望的编码将其放在程序之外(就像在您的情况下一样)数据库),你是安全的。正如你所看到的,其他一切都可能出错。
使用句柄(如文件或套接字)时,您可以使用PerlIO图层执行此操作,因此您不必明确使用解码/编码。