<@Googleからのリファラのデコード=http://www2u.biglobe.ne.jp/~shinta/be/Main.htm?_BL_Diary.htm?_BL_Diary_200508.htm#BD20050821C> Googleは % 文字を \n にエンコードしているようなので、Perlでデコードするには
sub url_decode {
    local $_ = shift;
    s/\\x/%/g;  # google用
    tr/+/ /;
    s/%([a-f\d])/pack('H2', $1)/gei;
    return $_;
}
とすればいいようだ。 JavaScript の escape 関数でエンコードされた文字列のデコード IE等のJavaScriptのescape関数では文字列は UCS-2 という文字コードにエンコードされるようだ(%uXXXX という表記法) 。 Perlでデコードするには、
sub url_decode {
    local $_ = shift;
    if (/%u[a-f\d]{4}/i) {
        s/%([a-f\d]{2})|%u([a-f\d]{4})|(.)/$1 ? "\x00".pack('H2', $1) : $2 ? pack('H4', $2) : "\x00$3"/gei;
    } else {
        tr/+/ /;
        s/%([a-f\d]{2})/pack('H2', $1)/gei;
    }
    return $_;
}
とすれば、EUCやShift JISに加えUCS-2にも対応できる。 ただし、Jcode.pm 0.88 で試したところUCS-2の文字コードを自動認識できないことがあったため、入力がUCS-2だと分かっているときは
Jcode::convert($str, 'euc', 'ucs2');
等と明示的に変換するとうまくいった。 ブックマーク用CGI <@はてなブックマーク=http://b.hatena.ne.jp>のようなCGIを作った。 気になったページをいちいちお気に入りに登録していてはお気に入りが肥大化してしまうし、ファイルにURLをメモするのは少し手間だったが、ブックマーク用CGIならbookmarkletで一発なので簡単にクリップできる。