URI转义/ unescape从Javascript到Perl

时间:2015-02-27 17:16:41

标签: javascript perl escaping uri

我有一个javascript从用户输入中读取的URL。 以下是javascript代码的一部分:

document.getElementById("Snd_Cont_AddrLnk_BG").value=encodeURI(document.getElementById("Con_AddresWeb_BG").value.toString());

然后我通过CGI将字符串的值发布到Perl脚本(这是perl代码的一部分):

#!/usr/bin/perl -w
##
##

use strict;
use CGI;
use CGI::Carp qw ( fatalsToBrowser );
use URI::Escape;

my $C_AddrLnk_BG=$query->param("Snd_Cont_AddrLnk_BG");

my $lst_upload_dir="../data";
my $lst_file_bg=$lst_upload_dir."/contacts_bg.js";

open(JSBG,">$lst_file_bg") || die "Failed to open $lst_file_bg\n";
printf JSBG "var GMapLink_bg=\"".uri_unescape($C_AddrLnk_BG)."\";\n";
close JSBG;
system("chmod 777 $lst_file_bg");

在uri_unescape的某个地方出现问题: 输入的原始字符串是:

https://www.google.bg/maps/place/42%C2%B044'15.0%22N+23%C2%B019'04.2%22E/@42.7368454,23.317962,16z/data=!4m2!3m1!1s0x0:0x0

javascript encodeURI()之后的字符串是:

https://www.google.bg/maps/place/42%25C2%25B044'15.0%2522N+23%25C2%25B019'04.2%2522E/@42.7368454,23.317962,16z/data=!4m2!3m1!1s0x0:0x0

在文件中打印的perl uri_unescape()之后的脚本是:

https://www.google.bg/maps/place/42%C2%B044'15.0%22N+23%C2%B019'04.2          0.000000E+00/@42.7368454,23.317962,16z/data=!4m2!3m1!1s0x0:0x0

我无法确定问题是在unescaping还是打印,而是

部分
  

%2522E

被解释为

      0.000000E+00

(有10个前导空格)。

任何人都可以帮我理解我做错了吗?

2 个答案:

答案 0 :(得分:2)

您的代码存在许多问题。

  

document.getElementById("Snd_Cont_AddrLnk_BG").value =
    encodeURI(document.getElementById("Con_AddresWeb_BG").value.toString());
     

我在这里想到encodeURI时无法理解。您应该拥有以下所有内容:

document.getElementById("Snd_Cont_AddrLnk_BG").value =
    document.getElementById("Con_AddresWeb_BG").value;
  

printf JSBG "var GMapLink_bg=\"".uri_unescape($C_AddrLnk_BG)."\";\n";
     

现在删除了错误的encodeURI,还需要删除uri_unescape

此外,在文本周围添加引号并不总是使其成为有效的JavaScript文字。最简单的方法如下:

use JSON qw( );

my $json = JSON->new()->allow_nonref();
$json->encode($C_AddrLnk_BG)

该代码段也误用了printfprintf采用格式参数,因此您需要

printf FH "%s", ...

或只是

print FH ...

所以你最终得到的是:

use JSON qw( );

my $json = JSON->new()->allow_nonref();
$json->encode($C_AddrLnk_BG)
print JSBG "var GMapLink_bg=" . $json->encode($C_AddrLnk_BG) ."\n";

答案 1 :(得分:1)

您使用printf代替print来输出uri_unescape的结果。它将%22E解释为宽度为22的工程格式浮点字段。可能在printf参数列表中没有其他内容,因此undef被评估为零,结果在 0.000000E+00

如果你有use warnings就位,你会看到Missing argument in printf

等消息