17

Perl スクリプトで URI (つまりパーセント) のエンコードとデコードを処理する必要があります。それ、どうやったら出来るの?


これは公式 perlfaqからの質問です。perlfaq を Stack Overflow にインポートしています。

4

3 に答える 3

27

これは、公式の 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;
于 2010-12-22T15:13:16.793 に答える
4

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;

コーダーがコーダーを助ける - 知識を物々交換!

于 2015-11-12T17:21:12.263 に答える