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>
これならちゃんと開ける。
コメント
[…] https://loumo.jp/wp/archive/20180628110033/ […]