それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

ruby のURI.parse が日本語GET引数や日本語UTF-8のパスに対応しなくなった

対応しなくなったんですよ。マジで。

日本語を含むとエラー

>> URI.parse 'http://example.com/あああ'
URI::InvalidURIError: URI must be ascii only "http://example.com/\u{3042}\u{3042}\u{3042}"
from /Users/takuya/.rbenv/versions/2.2.3/lib/ruby/2.2.0/uri/rfc3986_parser.rb:20:in `split'
>>

ruby まじどうしようもないな。

日本語を含むURIはASCIIにEncodeしろってことだろうけどさ、ブラウザからURIをコピペしたら日本語含まれるじゃん?

日本語が含まれたまま使えないと不便だよね。

モンキーパッチで対応する

require 'uri'


module URI
  class << self
    alias :_parse :parse

    def parse a, original=false
      return self._parse a if original

      r=/[一-龠]+|[ぁ-ん]+|[ァ-ヴー]+|[a-zA-Z0-9]+/
      a = a.gsub(r){|m|  URI.encode_www_form_component(m) }

      u = self._parse a
      return u
    end
  end
end

とりあえず対応することが出来る。大抵のURIはコレで対応できそう。

npm のモジュール地獄見てて、gem の同じような地獄に成りつつあるし。イチイチ依存Gem増やす必要はないかもしれない。

関連資料

ruby で URL をパースしてGET引数をHashに展開する。(日本語URI対応) - それマグで!