スマホアプリからBase64エンコード化した文字列をサーバに送信する場合、適切にURLエンコードする必要があるので、その方法についてのメモ
前提
送信する形式は、GETもしくはForm送信時と同形式のPOSTとする
この場合、
key1=value1&key2=value2&...
という形式でキー&バリューを並べる事になる
また、application/x-www-form-urlencoded
という規格に従ってURLエンコードを行う必要がある
例えば、+
は半角スペースと認識されるため、%2B
に変換しておく必要がある
方針
Base64エンコードで出てくる文字は[a-zA-Z0-9+/]
の64種類であり、その中でエンコードの必要があるのは+
・/
の2種類のみである(厳密に言えば、パディングで利用される=
もあるようだが、本記事では一旦置いておく)
そのため、これら2種類の文字がエンコードされるよう、利用するメソッドやその引数を選択すれば良い
各プラットフォームごとの方法
Android
AndroidのSDKに用意されているURLEncoderを利用すれば十分である
以下Kotlinでの実装例
val original = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/"
val encoded = URLEncoder.encode(original, "utf-8")
println("Encoded: $encoded")
Encoded: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ%2B%2F
iOS
Swiftを利用する場合、URLエンコードにはStringのaddingPercentEncodingメソッドが利用できる
エンコード例外文字列には、アルファベットと数字のみ(alphanumerics
)を指定すれば十分である
以下Swiftでの実装例
let original = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/"
let encoded = original.addingPercentEncoding(withAllowedCharacters: .alphanumerics)!
print("Encoded: \(encoded)")
Encoded: 0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ%2B%2F