ちょっと必要になったので。
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使うのめんどいな。
何のために使うかというと、はてなのエスケープ済みのキーワードを文字列に戻したいな、という目的でした(なのでEUC→SJISに変換してる)。Perlだと一行なのに、Rだとちょっと大変・・・。まあ、元々こういうことをするものではないのでしょうが。
んー
Perlだとぐぐって10秒なのが、Rだと例も出てこないしいちいち調べないといけない・・・。それがまた楽しい。