ネットの海の片隅で

技術ネタの放流、あるいは不法投棄。

エンコードしない文字を指定できるURIエンコーダ「uri_encoding」

世間がRubyKaigiで盛り上がっていて寂しかったので、URIエンコード・デコードを行うgemを書きました。

s-osa/uri_encoding · GitHub

インストール

uri_encoding | RubyGems.org | your community gem host に置いてあるので、テキトーにbundle installとかgem install url_encodingとかしてくれればインストールできます。

使い方

基本

UriEncodingモジュールは.encode.decodeを持っています。

UriEncoding.encode("Aa1!?_%") #=> "Aa1!?_%25"
UriEncoding.decode("Aa1!?_%25") #=> "Aa1!?_%"

このときにエンコードされる文字はRFC3986で定義されている「予約文字と非予約文字」以外の文字です。

エンコードしない文字を指定する

UriEncoding.encodeエンコード対象から外す文字を第2引数として受け取れます。

たとえば、全ての文字をパーセントエンコードする場合、

UriEncoding.encode("Aa1!?_%", []) #=> "%41%61%31%21%3F%5F%25"

とすることで実現できます。

また、RFC3986で定義されている非予約文字以外をエンコードする場合は

UriEncoding.encode("Aa1!?_%", UriEncoding::UnreservedCharacters) #=> "Aa1%21%3F_%25"

数字をエンコード対象から除外したい場合は

UriEncoding.encode("Aa1!?_%", (0..9).to_a.map(&:to_s)) #=> "%41%611%21%3F%5F%25"

とすることでそれぞれ実現できます。

デコード後の文字コードを指定する

UriEncoding.decode はデコード先の文字コードを第2引数として受け取れます。

string = UriEncoding.decode("%82%A0%82%A2%82%A4", Encoding::Windows_31J) #=> "あいう"
string.encoding #=> #<Encoding:Windows-31J>

第2引数を指定しない場合は第1引数として与えられた文字列のEncodingを使います。

動機

Amazon マーケットプレイスWebサービスAPIを叩くときに「RFC3986の非予約文字以外をURLエンコードしろ」という指示があったのでエンコーダを探したのですが、適当なものが見つからなかったため作りました。

エンコードしない文字を引数で渡せるので、比較的汎用性は高いと思います。