• 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

RubyでバイナリデータをBase64エンコードする場合、
require 'base64'をしてからBase64.encode64(binary)をするか、
以下のようにpackmテンプレートを使うことができます。

ruby>>
[binary].pack('m') #=> Base64 encoded string
<<--

しかし、アップロードしたファイル用のテンポラリなファイル名
などに使用する場合、Base64でエンコードした文字列は
ファイル名に使えない(可能性が高い)文字を含んでいるため、
そのような場合にはbase64url形式でエンコードします。

base64url って何?

base64url とは、base64 を基に RFC4648 で規定された変換方式で、url とファイル名に使用しても安全になるように設計されています。変更点は、base64 では + と / が使用されていますが、それを - と _ を使用するようにします。具体的には、base64では「ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/」の表で変換しますが、base64url では「ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_」を使用します。

ということで、通常のBase64エンコードした結果に対して、
+-に、/_に置き換えればいいだけなので、
以下のようにすればOKです。

ruby>>
[binary].pack('m').tr('+/', '-_')
<<--

posted by genki genki on Thu 24 Jan 2008 at 06:02 with 0 comments