Rubyで日本語を含むURLを扱う
メモっぽい記事を書くのはあまり好きではないのですが、せっかく調べたので書きます。
Ruby1.9に移行したらどうなるのかはわかりませんけど、日本語の処理に多少の不安を残すRuby1.8にとって、日本語を含むURL、例えばwikipediaなどは扱いにくいです。
Rubyで検索エンジンっぽいものを作っていまして、open-uriというモジュールで日本語を含むURLを開こうとしたらエラーが出てしまいました。
ちなみに私の環境はruby 1.8.7 (2009-06-12 patchlevel 174) [universal-darwin10.0]です。古そうだね。
バイト単位の処理と文字単位の処理を混同してしまうので、文字列処理は難しい。
URLのエンコード
ブラウザは、URLにエスケープされた文字列が含まれていた場合それを展開して表示しているようですが、通信するときはエンコードしています。
参考 http://ja.wikipedia.org/wiki/URLエンコード
Rubyのライブラリを使う
探したらあった。
require 'URI' puts URI.encode('http://ja.wikipedia.org/wiki/陰陽')
実行結果
http://ja.wikipedia.org/wiki/%E9%99%B0%E9%99%BD
同じくURI.decodeでデコードができます。
自分で書いたコード
説明的で分かりやすいコードだと思います。
def encode url ret = '' url.split(//).each { |ch| if ch.size != 1 ch.bytes.each { |ch| ret.concat sprintf("%%%02x", ch) } else ret.concat ch[0] end } return ret end