« サイボウズ Office に Perl でアクセス | メイン | C - a pseudo-interpreter of the C programming language »
2006年01月04日
URL と Base64
URL にバイナリデータを埋め込んで渡すことが、ままあります。私のケース注1では、バイナリデータが結構大きかったので hex encode は避けたいところ。 base64 エンコードしようと思ったのですが、 path や query に + や / といった文字は入れたくありません。
じゃあ、みんなどうしているのかな、と思って、聞いたり調べたりしたところ、いろいろな変換方式があるようです。
採用アプリ | 変換方式 | ||
---|---|---|---|
Hibernate | +/ → *- | ||
IMAP4 | +/ → +, | ||
IRCu | +/ → [] | ||
Python | +/ → -_ | ||
正規表現フリー注2 | +/ → !- |
IMAP4 方式以外は、URL の中に埋め込んで使えそうです。中でも Python は、組み込み関数の urlsafe_b64encode, urlsafe_b64decode で対応しているのが素敵です。
ちなみに、Python のマネをしようと思うと、他の言語では下表のような感じになると思います。Ruby は良くわかりませんが、Perl と似た状況のようです。
言語 | エンコード | デコード |
---|---|---|
Python | urlsafe_b64encode | urlsafe_b64decode |
Perl | encode_base64 → tr|+/|-_| | tr|-_|+/| → decode_base64 |
PHP | str_replace(array('+','/'), array('-','_'), base64_encode(data)) | base64_decode(str_replace(array('-','_'), array('+','/'), data)) |
注1: 「RSS Feed と認証」の、パスワードを暗号化したかった
注2: 正規表現のメタ文字を含まないエンコードになります
投稿者 kazuho : 2006年01月04日 15:13
トラックバック
このエントリーのトラックバックURL:
http://labs.cybozu.co.jp/cgi-bin/mt-admin/mt-tbp.cgi/323
このリストは、次のエントリーを参照しています: URL と Base64:
» MIME::Base64::URLSafe from Kazuho@Cybozu Labs
少し前になりますが、CPAN に MIME::Base64::URLSafe ... [続きを読む]
トラックバック時刻: 2006年01月16日 21:26
» Second Lifeのlslで日本語を使う from izumiのqdoblog 弓道部
Second Lifeのlslエディット画面では日本語が入力できません。 そのた... [続きを読む]
トラックバック時刻: 2007年04月16日 17:53
コメント
urlsafeに関してですが, RFC3548 The Base16, Base32, and Base64 Data Encodings の中の
4. Base 64 Encoding with URL and Filename Safe Alphabet で, 62 - (minus) 63 _ (understrike) の記述があります. Python もこちらを参照しているのではないでしょうか.
投稿者 hio : 2006年01月26日 15:05
hio さん:
python の base64 のソースコードに、「Modified 30-Dec-2003 by Barry Warsaw to add full RFC 3548 support」とあるので、おっしゃるとおりだと思います。ありがとうございます。
cf. http://svn.python.org/projects/python/trunk/Lib/base64.py
投稿者 kazuho : 2006年01月26日 18:52