������Ȼפ��ФǤ����ΤǤ��ͤ���

[JavaScript] data��������URI�����ʲ����ǡ�����Base64�Ѵ���
��ǰ�ʤ��� Internet Explorer �� data ����������б����Ƥ��ʤ��Τ����ѤǤ��ޤ���
[��] HTML�ե������ʸ����Ȥ��Ʋ����ǡ�����������
ɽ���� IE6 �ǤϤ�������ɡ�Firefox ����OK��

����˴��Mac IE�Ǥ⸫��ޤ������ʲ���data:��������ˤ�륢��������ġ�

�פϡ�������ܤʤ鳰�˽Ф��Ƥ��ޤ��Ф����Ȥ������ȤǤ���inside out�ʤΤǡ�data��΢�֤���atad�Ȥ��Ƥ��ޤ���

atad.cgi
#!/usr/local/bin/perl -T
#
# $Id: atad.cgi,v 0.1 2006/10/02 20:36:53 dankogai Exp dankogai $
#
use strict;
use warnings;
use MIME::Base64;
use CGI;

sub error{
    print <<"EOT";
Status: 400
Content-Type: text/plain

@_
EOT
    exit();
}

my $q = CGI->new;
my $data = $q->param('data');
error "no data found" unless $data;
$data =~ s{ \A data:  }{}xo;

# http://labs.cybozu.co.jp/blog/kazuho/archives/2006/01/url_base64.php
# http://en.wikipedia.org/wiki/Base64#IRCu
$data =~ tr{[]!*}{+/=;}; 

$data =~ s{ \A (.+?);(.+?), }{}xo;
my ($type, $enc) = ($1, $2);
error "unknown encoding: $enc" unless $enc eq 'base64';
print "Content-Type: $type\n\n", decode_base64($data);

__END__

���Ȥϡ���������Ф������ǥ⤬��Ū�ʤΤǡ��֥饦���������å��Ϥ虜�ȳ����Ƥ���ޤ���Firefox��Safari�Ǥ�data:��http:�Ѵ����ʤ���ޤ������������ɽ������ޤ���

Client Source:
window.onload = function(e){
    // if (! IE ) return;
    var atad = 'http://www.dan.co.jp/~dankogai/cgi/atad.cgi?data=';
    var safe_b64 = function(str){
      var result = '';
      for (var i = 0; i < str.length; i++){
        var c = str.charAt(i);
        result += ( {'+':'[' , '/':']', '=':'!', ';':'*'}[c] || c);
      }
      return result;
    }
    var elems = document.all || document.getElementsByTagName('*');
    for (var i = 0; i < elems.length; i++){
        var src = elems[i].getAttribute('src');
        if (src && src.indexOf('data:', 0) != -1){
            elems[i].setAttribute('src', atad + safe_b64(src));
            //elems[i].setAttribute('src', atad + encodeURIComponent(src));
        }
    }
}

�ʲ���α����

  • window.addEventListner()�ϻ�ǰ�ʤ���Mac IE 5�ǤϻȤ��ʤ��ä��Τ�window.onload()����ѡ�
  • encodeURIComponent()��IE�Ǥ�̤���������������
    Kazuho@Cybozu Labs: URL �� Base64
    URL �˥Х��ʥ�ǡ�������������Ϥ����Ȥ����ޤޤ���ޤ�����Υ�������1�Ǥϡ��Х��ʥ�ǡ������빽�礭���ä��Τ� hex encode ���򤱤����Ȥ����� base64 ���󥳡��ɤ��褦�Ȼפä��ΤǤ����� path �� query �� + �� / �Ȥ��ä�ʸ�������줿������ޤ���
    �Ǥ�Ҳ𤵤�Ƥ���IRCu��Base64��Encode���ʤ����Ƥ��ޤ���
  • ����ϥǡ�����PATH_INFO��ͳ���Ϥ����Ȥ����ΤǤ��������ޤ��礭�ʥǡ������ȡ�pathĹ���פ�Apache���ܤ���Τǡ�data=data:...�Ȥ��ޤ�����

Enjoy!

Dan the Javascripting Perl Monger