URI.parse i unicode (Addressable gem)

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