Tuesday, September 15, 2009

iconv_mime_decode on Ruby

PHPには iconv_mime_decode()という便利な関数がある。
さすがはPHP.

というわけで、Rubyでも同じような関数がほしかったのでテキトーに実装してみる。
PHPの中は見てないのでどうなってるのか知らない。
def iconv_mime_decode( input, out_charset = 'utf-8' )
while input.sub!(/(=\?[A-Za-z0-9-]+\?[BQbq]\?[^\?]+\?=)(?:(?:\r\n)?[\s\t])+(=\?[A-Za-z0-9-]+\?[BQbq]\?[^\?]+\?=)/, '\1\2')
end
begin
ret = input.sub!( /=\?([A-Za-z0-9-]+)\?([BQbq])\?([^\?]+)\?=/ ) {
charset = $1
enc = $2.upcase
word = $3
word = word.unpack({ "B"=>"m*", "Q"=>"M*" }[enc]).first
Iconv.conv( out_charset, charset, word )
}
return ret ? iconv_mime_decode( input, out_charset ) : input
rescue
# "Error while converting MIME string."
return input
end
end
こんなんでいいかなぁ。

2 comments:

meka said...

This is awesome, thanks for sharing!

takuo said...

I've updated this code for Ruby1.9

Please check it out.
http://gist.github.com/282683