2012-03-22 70 views
4

我有一個頁面上的表單:如何編碼URL的西里爾文字符然後解碼它們?

<form method="POST" accept-charset="UTF-8" action="index.cgi" name="TestForm"> 

一個輸入欄「SEARCH_STRING」的可以用來發送西里爾字符,如果出現這種情況的URL字符串看起來是這樣的:

search_string=%41F%2F%424+%41F%41E%414%416%410%420%41A%410+%418%417+%421%412%418%41D 

我如何將它解碼回我發佈到的頁面上的原始字符串?

+0

看起來像是十六進制數據,然後url編碼..什麼是原始字符串? – 2012-03-22 10:24:06

回答

0

嘗試在你的腳本(index.cgi):

use Encode; 

則...

$search_string = decode_utf8($search_string); 

另一個想法(如果你想創建你的CGI的UTF8友好哈希輸入):

require Encode; 
require CGI; 
my $query = CGI ->new; 
my $form_input = {}; 
foreach my $name ($query ->param) { 
    my @val = $query ->param($name); 
    foreach (@val) { 
    $_ = Encode::decode_utf8($_); 
    } 
    $name = Encode::decode_utf8($name); 
    if (scalar @val == 1) { 
    $form_input ->{$name} = $val[0]; 
    } else {      
    $form_input ->{$name} = \@val; # save value as an array ref 
    } 
} 

來自http://ahinea.com/en/tech/perl-unicode-struggle.html

+0

那麼,使用decode_utf8()會生成不是我輸入的原始西里爾字符串的「AF/B4 AFAEA4A6A0B0AAA0 A8A7 B1A2A8AD」字符串。 – goe 2012-03-22 09:14:37

2

,可以保留+原始字符串的任何其他人物A溶液:

my $s = '%41F%2F%424+%41F%41E%414%416%410%420%41A%410+%418%417+%421%412%418%41D'; 
$s =~ s/%([[:xdigit:]]+)/chr(hex($1))/eg; 
print $s; 

結果:

П/Ф+ПОДЖАРКА+ИЗ+СВИН 
4

正確的解決方案,包括空格:

use open ':std', ':encoding(UTF-8)'; 
use Encode; 

my $escaped = '%41F%2F%424+%41F%41E%414%416%410%420%41A%410+%418%417+%421%412%418%41D'; 
(my $unescaped = $escaped) =~ s/\+/ /g; 
$unescaped =~ s/%([[:xdigit:]]+)/chr hex $1/eg; 
print $unescaped; 
# П/Ф ПОДЖАРКА ИЗ СВИН 

積分:Renaud Bompuis用於識別第一個以前綴爲%的Unicode代碼點。

我想補充一點,從問題的編碼方案是非常不尋常的,我以前沒有見過。通常人們會認爲字符串П/Ф ПОДЖАРКА ИЗ СВИН被編碼爲%D0%9F%2F%D0%A4+%D0%9F%D0%9E%D0%94%D0%96%D0%90%D0%A0%D0%9A%D0%90+%D0%98%D0%97+%D0%A1%D0%92%D0%98%D0%9D,也就是說,首先將字符編碼爲UTF-8,然後八位字節被轉義百分比。該方案適用於Dr.Kameleon的回答。

相關問題