話の流れで AKB48(), AKB48.decode() をガーッて。30分でガーッて作ってみたよ
(ε・◇・)з AKB48 って Base64 の亜種かなんかでしょ?
(ε・◇・)з でもちょっと余るんだな… 何個か抜かなきゃ…
(ε・◇・)з じゃあ A, K, B, 4, 8 と、恋愛禁止らしいので L, O, V, E も抜いちゃいますか!
Base64: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/ ↓↓ AKB48: CD FGHIJ MN PQRSTU WXYZ cd fghij mn pqrstu wxyz0123 567 9+/
(ε・◇・)з ガーッて書いてみたよ
// Usage: // var encoded = AKB48("おしめん"); // // console.log(encoded); // -> "pUCiQpUCjhpUDNDpUDPc" // // AKB48.decode(encoded); // -> おしめん var AKB48; AKB48 || (function(global) { global["AKB48"] = AKB48; global["AKB48"].decode = AKB48_decode; // === Another Kindness Base 48 ============================ // AKB48 - encode function AKB48(data) { // @param String: // @return UTF8AKB48String: // @desc: encode String to UTF8 + AKB48 formated String function _UTF8ByteArray(data) { var rv = [], i = 0, iz = data.length, c = 0; for (; i < iz; ++i) { c = data.charCodeAt(i); if (c < 0x80) { // ASCII(0x00 ~ 0x7f) rv.push(c & 0x7f); } else if (c < 0x0800) { rv.push(((c >>> 6) & 0x1f) | 0xc0, (c & 0x3f) | 0x80); } else if (c < 0x10000) { rv.push(((c >>> 12) & 0x0f) | 0xe0, ((c >>> 6) & 0x3f) | 0x80, (c & 0x3f) | 0x80); } } return rv; } AKB48._db || _initAKB48(); var rv = [], ary = _UTF8ByteArray(data), c = 0, i = -1, iz = ary.length, pad = [0, 2, 1][iz % 3], chars = AKB48._db.chars; --iz; while (i < iz) { c = (ary[++i] << 16) | (ary[++i] << 8) | (ary[++i]); // 24bit rv.push(chars[(c >> 19) & 0x1f], chars[(c >> 14) & 0x1f], chars[(c >> 9) & 0x1f], chars[(c >> 4) & 0x1f], chars[ c & 0x1f]); } pad > 1 && (rv[rv.length - 2] = "="); pad > 0 && (rv[rv.length - 1] = "="); return rv.join(""); } // AKB48#decode function AKB48_decode(data) { // @param UTF8AKB48String: // @return String: // @desc: decode UTF8 + AKB48 formated String function _UTF8Decode(byteArray) { var rv = [], ri = -1, i = 0, iz = byteArray.length, c = 0; for (; i < iz; ++i) { c = byteArray[i]; // first byte if (c < 0x80) { // ASCII(0x00 ~ 0x7f) rv[++ri] = c; } else if (c < 0xe0) { rv[++ri] = (c & 0x1f) << 6 | (byteArray[++i] & 0x3f); } else if (c < 0xf0) { rv[++ri] = (c & 0x0f) << 12 | (byteArray[++i] & 0x3f) << 6 | (byteArray[++i] & 0x3f); } } return String.fromCharCode.apply(null, rv); } AKB48._db || _initAKB48(); var rv = [], c = 0, i = -1, ary = data.split(""), iz = data.length - 1, codes = AKB48._db.codes; while (i < iz) { // 00000000|00000000|00000000 (24bit) c = (codes[ary[++i]] << 19) // 11111 | | | (codes[ary[++i]] << 14) // 111|11 | | (codes[ary[++i]] << 9) // | 11111 | | (codes[ary[++i]] << 4) // | 1|1111 | codes[ary[++i]]; // | | 1111 // v v v rv.push((c >> 16) & 0xff, // -------- (c >> 8) & 0xff, // -------- c & 0xff); // -------- } // cut tail rv.length -= [0, 0, 2, 1][data.replace(/\=+$/, "").length % 4]; return _UTF8Decode(rv); } // inner - init AKB48 function _initAKB48() { var base = "CDFGHIJMNPQRSTUWXYZcdfghijmnpqrstuwxyz01235679+/", i = 0, db = { chars: base.split(""), // ["C", "D", ... "/"] codes: { "=": 0 } }; for (; i < 48; ++i) { db.codes[base.charAt(i)] = i; } AKB48._db = db; } })(this);
(っ>﹏<)っ どこで使うんだろこれ…