URI 从 Javascript 转义/反转义到 Perl
URI escape / unescape from Javascript to Perl
我有一个 URL,javascript 从用户输入中读取。
这是 javascript 代码的一部分:
document.getElementById("Snd_Cont_AddrLnk_BG").value=encodeURI(document.getElementById("Con_AddresWeb_BG").value.toString());
然后我post把字符串的值通过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
javascriptencodeURI()后的字符串是:
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
我无法确定问题是出在反转义还是打印上,但是
%2522E
被解释为
0.000000E+00
(有 10 个前导空格)。
任何人都可以帮助我了解我做错了什么吗?
你的代码有很多问题。
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)
该代码段也误用了 printf
。 printf
接受一个格式参数,所以你想要
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";
您正在使用 printf
而不是 print
来输出 uri_unescape
的结果。它将 %22E
解释为宽度为 22 的工程格式浮点字段。假设您在 printf
参数列表中没有其他任何内容,因此 undef
被评估为零,结果在 0.000000E+00
.
如果您按应有的方式设置了 use warnings
,您会看到类似 Missing argument in printf
的消息
我有一个 URL,javascript 从用户输入中读取。 这是 javascript 代码的一部分:
document.getElementById("Snd_Cont_AddrLnk_BG").value=encodeURI(document.getElementById("Con_AddresWeb_BG").value.toString());
然后我post把字符串的值通过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
javascriptencodeURI()后的字符串是:
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
我无法确定问题是出在反转义还是打印上,但是
%2522E
被解释为
0.000000E+00
(有 10 个前导空格)。
任何人都可以帮助我了解我做错了什么吗?
你的代码有很多问题。
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)
该代码段也误用了 printf
。 printf
接受一个格式参数,所以你想要
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";
您正在使用 printf
而不是 print
来输出 uri_unescape
的结果。它将 %22E
解释为宽度为 22 的工程格式浮点字段。假设您在 printf
参数列表中没有其他任何内容,因此 undef
被评估为零,结果在 0.000000E+00
.
如果您按应有的方式设置了 use warnings
,您会看到类似 Missing argument in printf