<!DOCTYPE html> <html> <head> <title></title> <style type="text/css"> * { box-sizing: border-box; } .input, .output { width: 400px; height: 200px; } textarea { width: 100%; height: 100%; padding: 10px; resize: none; } .act { width: 100px; } button { display: block; margin: 20px auto; height: 30px; padding: 0 12px; border: 1px solid; line-height: 30px; color: #fff; background: #e55; outline: none; text-align: center; border-radius: 3px; cursor: pointer; transition: all .2s ease; } button:hover { background: #e44; } .inline-block { display: inline-block; vertical-align: top; } </style> </head> <body> <div class="input inline-block"> <textarea id="input-text"></textarea> </div> <div class="act inline-block"> <button id="encode">编码</button> <button id="decode">解码</button> </div> <div class="output inline-block"> <textarea id="output-text" disabled></textarea> </div> <script type="text/javascript"> /** * 转换对照表 * U+00000000 – U+0000007F 0xxxxxxx * U+00000080 – U+000007FF 110xxxxx 10xxxxxx * U+00000800 – U+0000FFFF 1110xxxx 10xxxxxx 10xxxxxx * U+00010000 – U+0010FFFF 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx **/ // '严'的Unicode编码为:0x4E25,它介于U+00000800 – U+0000FFFF之间,所以它占用三个字节。 window.base64 = { keyStr: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/", // 字符串转UTF8编码 encode_utf8: function(str) { var result = '', length = str.length; for (var i = 0; i < length; i++) { var ucode, byte1, byte2, byte3, byte4, u8code; ucode = str.charCodeAt(i); if (ucode <= 0x007F) { u8code = String.fromCharCode(ucode); } else if (ucode > 0x007F && ucode <= 0x07FF) { byte2 = 0x80 | (ucode & 0x3F); byte1 = 0xC0 | ((ucode >> 6) & 0x1F); u8code = String.fromCharCode(byte1) + String.fromCharCode(byte2); } else if (ucode > 0x07FF && ucode <= 0xFFFF) { byte3 = 0x80 | (ucode & 0x3F); byte2 = 0x80 | ((ucode >> 6) & 0x3F); byte1 = 0xE0 | ((ucode >> 12) & 0x0F); u8code = String.fromCharCode(byte1) + String.fromCharCode(byte2) + String.fromCharCode(byte3); } else if (ucode > 0xFFFF && ucode <= 0x10FFFF) { byte4 = 0x80 | (ucode & 0x3F); byte3 = 0x80 | ((ucode >> 6) & 0x3F); byte2 = 0x80 | ((ucode >> 12) & 0x3F); byte1 = 0xF0 | ((ucode >> 18) & 0x07); u8code = String.fromCharCode(byte1) + String.fromCharCode(byte2) + String.fromCharCode(byte3) + String.fromCharCode(byte4); } result += u8code; } return result; }, // UTF-8编码转字符串 decode_utf8: function(str) { var result = '', length = str.length; for (var i = 0; i < length; i++) { var u8code_1 = str.charCodeAt(i), ucode; if (u8code_1 >> 7 == 0) { // 单字节 ucode = u8code_1; } else if (u8code_1 >> 5 == 0x6) { // 双字节 var u8code_2 = str.charCodeAt(i+1); byte1 = u8code_1 & 0x1F; byte2 = u8code_2 & 0x3F; ucode = byte1 << 6 | byte2 i += 1; } else if (u8code_1 >> 4 == 0xE) { // 三字节 var u8code_2 = str.charCodeAt(i+1); var u8code_3 = str.charCodeAt(i+2); byte1 = u8code_1 & 0x0F; byte2 = u8code_2 & 0x3F; byte3 = u8code_3 & 0x3F; ucode = byte1 << 12 | byte2 << 6 | byte3; i += 2; } else if (u8code_1 >> 3 == 0xF0) { var u8code_2 = str.charCodeAt(i+1); var u8code_3 = str.charCodeAt(i+2); var u8code_4 = str.charCodeAt(i+3); byte1 = u8code_1 & 0x7; byte2 = u8code_2 & 0x3F; byte3 = u8code_3 & 0x3F; byte4 = u8code_4 & 0x3F; ucode = byte1 << 18 | byte2 << 12 | byte3 << 6 | byte4; i += 3; } result += String.fromCharCode(ucode); } return result; }, // base64编码 encode_bs64: function(str) { if (!str) { return; } // 先将字符串转换为UTF-8 var u8code = this.encode_utf8(str), length = u8code.length, i = 0, result = '', char1, char2, char3, index1, index2, index3, index4, encode1, encode2, encode3, encode4; // 再将UTF-8进行base64编码 while (i < length) { char1 = u8code.charCodeAt(i++); char2 = u8code.charCodeAt(i++); char3 = u8code.charCodeAt(i++); index1 = char1 >> 2; encode1 = this.keyStr.charAt(index1); index2 = ((char1 & 0x3) << 4) | (char2 >> 4); encode2 = this.keyStr.charAt(index2); index3 = ((char2 & 0x0F) << 2) | (char3 >> 6); encode3 = this.keyStr.charAt(index3); index4 = char3 & 0x3F; encode4 = this.keyStr.charAt(index4); // 最后使用'='补足位数为3的倍数 if (isNaN(char2)) { encode4 = encode3 = '='; } else if (isNaN(char3)) { encode4 = '='; } result += encode1 + encode2 + encode3 + encode4; } return result; }, // base64解码 decode_bs64: function(str) { if (!str) { return; } // 先base64解码成UTF-8 var length = str.length, i = 0, u8code = '', result = '', char1, char2, char3, encode1, encode2, encode3, encode4; str = str.replace(/[^A-Za-z0-9+/=]/g, ""); while (i < length) { decode1 = this.keyStr.indexOf(str.charAt(i++)); decode2 = this.keyStr.indexOf(str.charAt(i++)); decode3 = this.keyStr.indexOf(str.charAt(i++)); decode4 = this.keyStr.indexOf(str.charAt(i++)); char1 = (decode1 << 2) | (decode2 >> 4); char2 = ((decode2 & 0xF) << 4) | (decode3 >> 2); char3 = ((decode3 & 0x3) << 6) | decode4; u8code += String.fromCharCode(char1); if (decode3 != -1) { u8code += String.fromCharCode(char2); } if (decode4 != -1) { u8code += String.fromCharCode(char3); } } // 再将UTF-8转换成字符串 result = this.decode_utf8(u8code); return result; } }; var btn_en = document.getElementById("encode"), btn_de = document.getElementById("decode"), input_text = document.getElementById('input-text'), output_text = document.getElementById('output-text'), b64, d64; btn_en.onclick = function() { b64 = base64.encode_bs64(input_text.value); output_text.value = b64; } btn_de.onclick = function() { d64 = base64.decode_bs64(input_text.value); output_text.value = d64; } </script> </body> </html>
评论已关闭!