🔠

改行なしのBase64エンコードをする方法いろいろ

2022/02/04に公開

HTMLで画像を本文中に埋め込む場合などに、data URIを利用することがあります。

例えばこんな感じに使用します:

<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==" alt="Red dot" />

この際、データは基本的には<sub>※例外下記</sub>改行なしのBase64エンコード文字列として埋め込みますが、この文字列を生成するための様々な方法に関する備忘録です。

※補足: 上記の例のように HTML5 の src アトリビュートに埋め込むような場合では、空白があっても無視されるので問題ないようです。

openssl

-A オプションを付けると改行がなくなります。

openssl base64 -A -in INPUT_FILE -out OUTPUT_FILE

base64 コマンド

同じ base64 という名前のコマンドが複数プラットフォームにあって、かつオプションが微妙に異なるようです...

MacOS版

base64 -i INPUT_FILE > OUTPUT_FILE

GNU Coreutils

-w オプションで改行までの長さを変更可能。-w 0 にすると改行がなくなります。

base64 -w 0 INPUT_FILE > OUTPUT_FILE

Perl ワンライナー

encode_base64() の第2引数によって区切りの変更ができます。

perl -MMIME::Base64 -0777 -ne 'print encode_base64($_,"")' < INPUT_FILE > OUTPUT_FILE

Ruby ワンライナー

ruby -r base64 -e "print Base64.strict_encode64($_)" < INPUTFILE > OUTPUT_FILE

encode64 ではなく、 strict_encode64 を使うのがポイント。

Python ワンライナー

あまり上品じゃないが以下で可能

python -c "import sys,base64;print(base64.b64encode(sys.stdin.buffer.read()).decode())" < ¥
INPUT_FILE > OUTPUT_FILE

ちなみに改行発生していいならもっと楽。残念ながら改行をなくすためのオプションが無い。

python -m base64 < INPUT_FILE > OUTPUT_FILE

Discussion