Base64 デコード(charset判定総当たり版) Fork

  • /*
     * @title Base64 デコード(charset判定総当たり版)
     * @description 割といける。
     * @include *
     * @javascript_url
     */
    
    ((r = window.getSelection(), s = String(r), p = r.anchorNode, e = '', a, t) => {
    
    	if (p.nodeType == 3) p = p.parentNode;
    	s = atob(s.replace(/^[^a-zA-Z0-9=\+\/]+/, '').split(/[^a-zA-Z0-9=\+\/\s\r\n]/)[0].replace(/[\s\r\n]/g, ''));
    	if (!p || !s) return;
    
    	a = Uint8Array.from(s, c => c.charCodeAt(0));
    
    	// ダメな例:
    	// u8のサロゲートペアがu16として通る
    	// u16のサロゲートペアがsjisとして通る
    	// sjisがu16として通る
    	for (let charset of ["iso-2022-jp", "euc-jp", "utf-8", "sjis", "utf-16"]) {
    		try {
    			s = new TextDecoder(charset, {fatal: true}).decode(a);
    			break;
    		} catch(e){}
    	}
    
    	p.appendChild(Object.assign(document.createElement('span'), {
    	 textContent: s,
    	 style: 'display: block; margin: 1em; white-space: pre-wrap;'
    	}));
    
    })();
    
    /*
    
    少なくともfork元で例示されていた、下記ページに載ってるものは全てデコードできた。
    http://q.hatena.ne.jp/1289780783
    http://d.hatena.ne.jp/kuro-yo/20101115/1289825621
    http://yurume.hatenadiary.jp/entry/20101116/QmFzZTY0
    
    
    テスト用文字列の方は微妙。サロゲートペアが鬼門っぽい?
    どこがどう被るのか詳しくは確認してないです。
    
    iso-2022-jp
    GyRCJWElbSU5JE83Y0VcJDckPyEjGyhC
    GyhJUltdGyRCJE83YyQmJF4kQCRDJD8hIxsoQg==
    
    sjis
    g4GDjYNYgs2Mg5N7grWCvYFC
    0tvdgs2Mg4KkgtyCvoLBgr2BQg==
    
    euc-jp
    peGl7aW5pM+348XcpLekv6Gj
    jtKO247dpM+346SmpN6kwKTDpL+how==
    
    utf-8
    44Oh44Ot44K544Gv5r+A5oCS44GX44Gf44CC
    776S776b776d44Gv5r+A44GG44G+44Gg44Gj44Gf44CC
    8J+NiPCfmIvwn5KX
    
    utf-16
    4TDtMLkwbzDAbxJgVzBfMAIw
    kv+b/53/bzDAb0YwfjBgMGMwXzACMA==
    PNhI3z3YC9492Jfc
    */
    
  • Permalink
    このページへの個別リンクです。
    RAW
    書かれたコードへの直接のリンクです。
    Packed
    文字列が圧縮された書かれたコードへのリンクです。
    Userscript
    Greasemonkey 等で利用する場合の .user.js へのリンクです。
    Loader
    @require やソースコードが長い場合に多段ロードする Loader コミのコードへのリンクです。
    Metadata
    コード中にコメントで @xxx と書かれたメタデータの JSON です。