【发布时间】:2012-05-02 09:03:03
【问题描述】:
我使用$cgi->param('search_string'); 在我的 Perl 脚本中检索 url 参数,但我怀疑 $cgi->param 值在我得到它之前正在通过 uri_unescape() 函数传递。
例子:
- 表单有一个
search_string=ЛИКЕР ВИШНЕВЫЙ - 网址有一个
search_string=%41B%418%41A%415%420+%412%418%428%41D%415%412%42B%419 - 但是
$cgi->param('search_string')返回ABA8AAA5B0+A2A8B8ADA5A2BBA9而不是%41B%418%41A%415%420+%412%418%428%41D%415%412%42B%419,我可以简单地解码。
以下是我的代码中实际发生的情况:
我将这个“ПЛЕНКА ПИЩЕВАЯ”作为 $search_string 传递;
$search_string =~ s/\s/+/g;
$search_string =~ s/\#/\%23/g;
$search_string =~ s/[^A-Za-z0-9\+\*\.\@\_\-]/uc sprintf("%%%02x",ord($&))/egx;
我在 URL 本身中得到了这个 search_string=%41F%41B%415%41D%41A%410+%41F%418%429%415%412%410%42F。
然后,当我使用$cgi->param('search_string') 在另一端检索该值时,我得到了这个"AFABA5ADAAA0 AFA8B9A5A2A0BF"。这里的另一个问题是 $cgi->param('search_string') 似乎确实会自动调用 uri_unescape() ,这就是我得到"AFABA5ADAAA0 AFA8B9A5A2A0BF" 的原因。
我如何才能使最终结果以"ПЛЕНКА ПИЩЕВАЯ" 的形式返回给我?
【问题讨论】:
-
显示一些重现此行为的代码。您可能有编码问题,而不是 CGI 方法。
-
我将代码添加到问题中,如果您知道如何解决此问题,请告知
标签: perl character-encoding internationalization cgi