Ruby: 非ASCII文字列がパーセントエンコードされていないかもしれないURLもがんばってパースする

normalized_url =
  begin
    URI.parse(url)
  rescue URI::InvalidURIError
    URI.parse(url.gsub(/\p{^ASCII}/) {|s| URI.encode_www_form_component(s) })
  end

URL中の非ASCII文字列をパーセントエンコードしてない (例: http://example.com/?q=姉) と `URI::InvalidURIError` が投げられるので、それを補足しUnicodeプロパティの否定を使ってエンコードしなおして再度 `URI.parse` するというもの。

雑なスクリプト中で使う用途なのでかなり雑だけど、これでだいたいうまくいったので満足。