Ruby で日本語を含む URL を読み込むと URI must be ascii only と言われた

シェアする

Ruby を用いたスクリプトで日本語を含む URL を開こうとしたところ、以下のように "URI::InvalidURIError (URI must be ascii only..." というエラーが表示された。

irb(main):001:0> require 'open-uri'
=> true
irb(main):002:0> url = 'https://loumo.jp/?s=ほげ'
=> "https://loumo.jp/?s=ほげ"
irb(main):003:0> o = open(url)
Traceback (most recent call last):
        6: from /Users/ryomatsu/.rbenv/versions/2.5.0/bin/irb:11:in `<main>'
        5: from (irb):5
        4: from /Users/ryomatsu/.rbenv/versions/2.5.0/lib/ruby/2.5.0/open-uri.rb:34:in `open'
        3: from /Users/ryomatsu/.rbenv/versions/2.5.0/lib/ruby/2.5.0/uri/common.rb:237:in `parse'
        2: from /Users/ryomatsu/.rbenv/versions/2.5.0/lib/ruby/2.5.0/uri/rfc3986_parser.rb:73:in `parse'
        1: from /Users/ryomatsu/.rbenv/versions/2.5.0/lib/ruby/2.5.0/uri/rfc3986_parser.rb:21:in `split'
URI::InvalidURIError (URI must be ascii only "https://loumo.jp/?s=\u307B\u3052")

"ascii only" なので日本語だけがダメというわけでなく、URI は全て ASCII 文字列でないとダメのようだ。Ruby でこのように URL に日本語を含める場合に、URI.encode メソッドを利用する必要がある。

irb(main):004:0> url = URI.encode 'https://loumo.jp/?s=ほげ'
=> "https://loumo.jp/?s=%E3%81%BB%E3%81%92"
irb(main):005:0> o = open(url)
=> #<Tempfile:/var/folders/z4/z98_tjg90dl3pw4bk5_m4_tw0000gn/T/open-uri20180627-13977-xwy9zi>

これならちゃんと開ける。

Sponsored Link

シェアする

フォローする