これも、何年か前に尋ねられた事だ。その時のメモを見つけたので、ここにも貼っておこう。
ColdFusion 2021は
BinaryEncode(), BinaryDecode()関数
でbase64Urlの変換に対応している
「ColdFusionでBase64urlのデータをデコードしたいんです」と言われた時、Base64urlって何???ってなった。
知らないなぁ。。。で話が終われそうになかったので、当時、調べてみた。URLセーフなBase64ってことか。
このページの説明がとても詳しくて分かりやすい!
なるほど。Base64で文字列に変換した際にURL変数の値として渡した際に問題になりそうな文字があるから、「+ を - に」、「/ を _ に」変換して、そして、末尾の「=」を削除すると。
じゃあ、Base64urlの値をBase64に戻すには、ReplaceList()関数で #ReplaceList("Base64urlでエンコードされた値","-,_", "+,/")
で変換して、
末尾の「=」は、BASE64の規格で各6ビットの値を変換表を使い4文字ずつ変換した際に、4文字に満たない分「=」を追加して4文字にしているんだから
Len("Base64urlでエンコードされた値") Mod 4
で余りを計算して、余った数だけ「=」を追加すれば良いんだ。
動きは理解したからあとはプログラムを書けば良いのだけれども、どこかにColdFusionベースのサンプルが掲載されていないかな?と探したら、海外のColdFusionユーザーでBennadel氏(自分が最も頼りにしている)のブログにそのものズバリのプログラムを見つけた。紹介しているプログラムも分かりやすい。これで解決。
ColdFusion 2021ではBase64Urlのエンコード・デコードをサポート
ColdFusion 2021の機能強化で、BinaryEncode()
と BinaryDecode()
のBase64Url エンコーディングがサポートされたので、ColdFusion 2021では標準の関数で対応できるようになった(まだ、動作は試していないけど)。