LoginSignup
51

More than 5 years have passed since last update.

RubyでBase64URLエンコーディング

Posted at

Base64はA–Z, a–z, 0–9, +, /の64文字を使って文字列をエンコードする方式で、+/がURLパラメータとして使うにはふさわしくないので、それを-_に置き換えたものをBase64URLエンコーディングと言います。

参考:http://ja.wikipedia.org/wiki/Base64

この方式でエンコード/デコードするには、Base64クラスのurlsafe_encode64urlsafe_decode64を使えば出来ます。

encode_decode.rb
require "base64"

basic_enc   = Base64.encode64('ab?cd~')         # => "YWI/Y2R+ZQ==\n"
original = Base64.decode64(basic_enc)           # => "ab?cd~e"

urlsafe_enc = Base64.urlsafe_encode64('ab?cd~') # => "YWI_Y2R-ZQ=="
original = Base64.urlsafe_decode64(urlsafe_enc) # => "ab?cd~e"

おまけ:パディングの'='をなくして、少し短くする

base64エンコードは4文字区切りなので、エンコード結果が4の倍数にならなかったときはパディングと言って'='が入ります。
これは別に削除してしまってもデコード時に4の倍数になるように'='を追加してあげられるので

base64.rb
module Base64
  def self.short_urlsafe_encode64(str)
    urlsafe_encode64(str).delete('=')
  end

  def self.short_urlsafe_decode64(str)
    urlsafe_decode64(str + '=' * (-1 * str.size & 3))
  end
end
encode_decode.rb
enc = Base64.short_urlsafe_encode64('ab?bc~e')  # => "YWI_YmN-ZQ"
original = Base64.short_urlsafe_decode64(enc)   # => "ab?cd~e"

のような関数を作り、使うことができます。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
51