url编码的奇怪问题

时间:2013-01-28 10:01:52

标签: php javascript url character-encoding

搜索我的应用程序的未捕获异常日志(js - > php - > vb6 dll)我发现了一个奇怪的错误:

file: /displaywords_GET.php?GreekWord=%E1%ED%E8%F1%F9%F0%EF%EC%DE%ED%E1%F2&selectedRes=1 # <b>Source:</b> mydll<br/><b>Description:</b> Invalid procedure call or argument # Variables:
 # Array
(
    [GreekWord] => ανθρωπομήνας
    [selectedRes] => 1
)

因此给定参数会出现.dll中的异常。我通过输入特定的单词在应用程序中自己测试它并且没有发生错误。然后我通过直接在地址栏中输入编码的URL进行测试,并重现了错误。因此,为了查看编码是否有问题,我在javascript中做了

encodeURIcomponent("ανθρωπομήνας")

结果是:

%CE%B1%CE%BD%CE%B8%CF%81%CF%89%CF%80%CE%BF%CE%BC%CE%AE%CE%BD%CE%B1%CF%82

这与php日志中的GET参数非常不同。然后我尝试解码url get参数,如php文件中所示:

decodeURIcomponent("%E1%ED%E8%F1%F9%F0%EF%EC%DE%ED%E1%F2")

和javascript说:格式错误的URI序列。为什么会这样?显然应用程序崩溃是因为特定的URL参数格式不正确,而不是正确的。

现在,我的问题是,如何查看编码的字符串是正确的还是损坏的字符串? (虽然我不确定为什么php似乎在日志中正确解码它,当javascript说它格式不正确时)。

提前感谢!

1 个答案:

答案 0 :(得分:1)

%E1%ED...是ISO-8859-7字符集中表示的字符串的URL编码。在对字节进行URL编码之前,您需要转换为UTF-8编码,因为JavaScript只适用于UTF-8字符串。

$word = 'ανθρωπομήνας';
var_dump(urlencode($word)); // %E1%ED%E8%F1%F9...

$utf8word = iconv('ISO-8859-7', 'UTF-8', $word);
var_dump(urlencode($utf8word)); // %CE%B1%CE%BD...