Base64エンコードとBase64URLエンコードについて
GoogleさんのProtocol Buffersでエンコードしたデータをクエリパラメータで含めようと思ったので改めてBase64エンコードとBase64URLエンコードについて調べてみました
Base64エンコーディングについては以下の記事でも軽く触っていますが、データを印字可能な64種類のデータで表現するエンコード方式です
よくマルチバイト文字やバイナリデータをポストするのに使っているイメージがします
ただ、URLの一部として利用する場合は62 indexの+
と63 indexの/
,パディングの=
がURLセーフではない(RFC3986とapplication/x-www-form-urlencoded)ため、
URLセーフにエンコードするべきです
パーセントエンコーディングはデカいしキモいのでなるべく避けたいっすね
Base64URL Encoding
+
を-
に、/
を_
に変更するのが仕様みたいです。パディングは省略されます
RFC 4648 - The Base16, Base32, and Base64 Data Encodings
このようにBase64の中でもこのようにURLセーフなものをBase64URLと区別します
Ruby
RubyではBase64.#urlsafe_encode64にて提供されますが、内部的にはRFC4648で変換した後、後から+
と/
を置換します
https://apidock.com/ruby/Base64/urlsafe_encode64
def urlsafe_encode64(bin) strict_encode64(bin).tr("+/", "-_") end
Go
Goではbase64.RawURLEncodingにて提供されます。Paddingを含むbase64.URLEncodingもあります
Rubyとは違って置換ではなくはcharsetが予めURLセーフになっている点が無駄がないですね
const encodeURL = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" // ... var RawURLEncoding = URLEncoding.WithPadding(NoPadding)