« サイボウズ Office に Perl でアクセス | メイン | C - a pseudo-interpreter of the C programming language »

2006年01月04日

URL と Base64

 URL にバイナリデータを埋め込んで渡すことが、ままあります。私のケース注1では、バイナリデータが結構大きかったので hex encode は避けたいところ。 base64 エンコードしようと思ったのですが、 path や query に + や / といった文字は入れたくありません。

 じゃあ、みんなどうしているのかな、と思って、聞いたり調べたりしたところ、いろいろな変換方式があるようです。

Base64 からの変換表
採用アプリ変換方式
Hibernate+/ → *-
IMAP4+/ → +,
IRCu+/ → []
Python+/ → -_
正規表現フリー注2+/ → !-

 IMAP4 方式以外は、URL の中に埋め込んで使えそうです。中でも Python は、組み込み関数の urlsafe_b64encode, urlsafe_b64decode で対応しているのが素敵です。
 ちなみに、Python のマネをしようと思うと、他の言語では下表のような感じになると思います。Ruby は良くわかりませんが、Perl と似た状況のようです。

言語毎の urlsafe_b64encoding
言語エンコードデコード
Pythonurlsafe_b64encodeurlsafe_b64decode
Perlencode_base64 → tr|+/|-_|tr|-_|+/| → decode_base64
PHPstr_replace(array('+','/'), array('-','_'), base64_encode(data))base64_decode(str_replace(array('-','_'), array('+','/'), data))

参考: Wikipedia: Base64


注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