RでURIアンエスケープ

ちょっと必要になったので。
http://cran.r-project.org/src/contrib/Descriptions/CGIwithR.html のhexDecode()関数を参考に作りました。

hexDecode <- function(string){
    string <- gsub("\\+", " ", string)
    string <- gsub("%09", "\t", string)
    string <- gsub("%0D%0A", "\n", string)
    string <- gsub("%0D|%0A", "\n", string)
    pieces <- strsplit(string, "%")[[1]]
    dehex <- function(string){
        hex <- substr(string, 1, 2)
        paste(rawToChar(as.raw(paste("0x", hex, sep=""))), substring(string, 3), sep = "")
    }
    pieces <- c(pieces[1], sapply(pieces[-1], dehex))
    paste(pieces, collapse = "")
}

実行結果

> iconv(hexDecode("%C0%E7%C2%E6%A5%A8%A5%EA"), "EUC-JP", "CP932")
[1] "仙台エリ"

本家のhexDecode()関数では、dehex()関数で%XXのXXを16進数に変換する部分*1をテーブル変換で実行してて、それはそれでよいのですがちとオーバースペックかな、と思ったので手計算。文字列を16進数として認識させるには、頭に"0x"をつける必要があるっぽい。で、Rは文字列連結の機能が弱い・・・。いちいちpaste使うのめんどいな。
何のために使うかというと、はてなエスケープ済みのキーワードを文字列に戻したいな、という目的でした(なのでEUCSJISに変換してる)。Perlだと一行なのに、Rだとちょっと大変・・・。まあ、元々こういうことをするものではないのでしょうが。

んー

Perlだとぐぐって10秒なのが、Rだと例も出てこないしいちいち調べないといけない・・・。それがまた楽しい。

追記

ついでにエスケープはどう書く?orgに投稿してみた。美しくない・・・。

*1:Perlでいう"pack('H2', $1)"