Niedawno napotkałem następujący problem:
URI.parse('http://www.test.com/łyżka')
dostajemy:
URI::InvalidURIError: bad URI(is not URI?): http://www.test.com/łyżka
from /usr/lib/ruby/1.8/uri/common.rb:436:in `split'
from /usr/lib/ruby/1.8/uri/common.rb:485:in `parse'
from (irb):3
To regexpowy parser w bibliotece URI nie rozpoznaje znaków spoza zestawu ASCII
Rozwiązaniem jest gem addressable:
gem install addressable
[code=ruby]require ‘addressable/uri’
uri = Addressable::URI.parse(‘http://www.test.com/łyżka’)
#<Addressable::URI:0xfdbd1398a URI:http://www.test.com/łyżka>
uri.path => “/\305\202y\305\274ka”[/code]
Poza tym Addressable daje nam też template’y:
Addressable::URI.expand_template("http://example.com/{query}/", {
"query" => "an+example+query"
})
i metodę .normalize
Dzięki Addressable mogłem się pozbyć hacków typu “usuń wszystkie znaki spoza ASCII z tego url’a przed parsowaniem”. Odkryłem go przypadkiem bawiąc się DataMapperem