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` するというもの。
雑なスクリプト中で使う用途なのでかなり雑だけど、これでだいたいうまくいったので満足。