エンコードしない文字を指定できるURIエンコーダ「uri_encoding」
世間がRubyKaigiで盛り上がっていて寂しかったので、URIエンコード・デコードを行うgemを書きました。
インストール
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エンコードしろ」という指示があったのでエンコーダを探したのですが、適当なものが見つからなかったため作りました。
エンコードしない文字を引数で渡せるので、比較的汎用性は高いと思います。