Perl スクリプトで URI (つまりパーセント) のエンコードとデコードを処理する必要があります。それ、どうやったら出来るの?
これは公式 perlfaqからの質問です。perlfaq を Stack Overflow にインポートしています。
Perl スクリプトで URI (つまりパーセント) のエンコードとデコードを処理する必要があります。それ、どうやったら出来るの?
これは公式 perlfaqからの質問です。perlfaq を Stack Overflow にインポートしています。
これは、公式の FAQ の回答からその後の編集を差し引いたものです。
これらのエンコーディングは、 RFC 2396 のセクション 2 で%
説明されているように、URI の予約文字を処理します。このエンコーディングは、予約文字を US-ASCII テーブルの文字番号の 16 進数表現に置き換えます。たとえば、コロン ,は になります。:
%3A
CGI スクリプトでは、 CGI.pmを使用している場合、URI のデコードについて心配する必要はありません。URI を自分で処理する必要はありません。
自分で文字列をエンコードする必要がある場合は、作成済みの URI をエンコードしようとしないでください。コンポーネントを個別にエスケープしてから、それらをまとめる必要があります。文字列をエンコードするには、URI::Escapeモジュールを使用できます。このuri_escape
関数は、エスケープされた文字列を返します。
my $original = "Colon : Hash # Percent %";
my $escaped = uri_escape( $original );
print "$escaped\n"; # 'Colon%20%3A%20Hash%20%23%20Percent%20%25'
文字列をデコードするには、uri_unescape 関数を使用します。
my $unescaped = uri_unescape( $escaped );
print $unescaped; # back to original
自分でやりたい場合は、予約文字をそのエンコーディングに置き換えるだけです。グローバル置換は、それを行う 1 つの方法です。
# encode
$string =~ s/([^^A-Za-z0-9\-_.!~*'()])/ sprintf "%%%0x", ord $1 /eg;
#decode
$string =~ s/%([A-Fa-f\d]{2})/chr hex $1/eg;
DIY エンコード (上記バージョンの改善):
$string =~ s/([^^A-Za-z0-9\-_.!~*'()])/ sprintf "%%%02x", ord $1 /eg;
('%0x' だけではなく、'%02x' に注意してください)
DIY デコード (「+」を追加 -> 「」):
$string =~ s/\+/ /g; $string =~ s/%([A-Fa-f\d]{2})/chr hex $1/eg;
コーダーがコーダーを助ける - 知識を物々交換!