这里有新鲜出炉的 Javascript 教程,程序狗速度看过来!
Javascript 是一种由 Netscape 的 LiveScript 发展而来的原型化继承的基于对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如 Perl,遗留的速度问题,为客户提供更流畅的浏览效果。
这篇文章主要介绍了 JS 实现对中文字符串进行 utf-8 的 Base64 编码的方法, 对比 java 的 base64 编码程序, 分析了 javascript 实现 base64 编码的相关技巧, 需要的朋友可以参考下
本文实例讲述了 JS 实现对中文字符串进行 utf-8 的 Base64 编码的方法。分享给大家供大家参考,具体如下:
要进行编码的字符串:"select 用户名 from 用户"
使用 JAVA 进行编码,Java 程序:
- String sql = "select 用户名 from 用户";
- String encodeStr = new String(Base64.encode(sql.getBytes("UTF-8"))); // 编码
- System.out.println(encodeStr);
得到:
- c2VsZWN0IOeUqOaIt + WQjSBmcm9tIOeUqOaItw ==
在 Java 中解码:
- sql = new String(Base64.decode(sql.getBytes()), "UTF-8");
Java 代码中为什么要使用 getBytes("UTF-8") 呢?因为 Windows 和 Linux 环境下默认编码不同,要使你的程序在不同平台下得到相同编码,必然要指定编码
虽然 html 和 JS 的编码都是 utf-8,但 JS 从页面上得到的中文编码却是 utf-16,所以直接对中文进行 Base64 编码将得到错误的结果,所以我们要先从 utf-16 转到 utf-8 再编码
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml">
- <head>
- <title>
- </title>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
- <style type="text/CSS">
- <!-- body{ margin:0px; padding:0px; } body,td{ font-size:9pt; } -->
- </style>
- <script type="text/Javascript">
- < !--
- var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
- //将Ansi编码的字符串进行Base64编码
- function encode64(input) {
- var output = "";
- var chr1, chr2, chr3 = "";
- var enc1, enc2, enc3, enc4 = "";
- var i = 0;
- do {
- chr1 = input.charCodeAt(i++);
- chr2 = input.charCodeAt(i++);
- chr3 = input.charCodeAt(i++);
- enc1 = chr1 >> 2;
- enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
- enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
- enc4 = chr3 & 63;
- if (isNaN(chr2)) {
- enc3 = enc4 = 64;
- } else if (isNaN(chr3)) {
- enc4 = 64;
- }
- output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) + keyStr.charAt(enc3) + keyStr.charAt(enc4);
- chr1 = chr2 = chr3 = "";
- enc1 = enc2 = enc3 = enc4 = "";
- } while ( i < input . length );
- return output;
- }
- //将Base64编码字符串转换成Ansi编码的字符串
- function decode64(input) {
- var output = "";
- var chr1, chr2, chr3 = "";
- var enc1, enc2, enc3, enc4 = "";
- var i = 0;
- if (input.length % 4 != 0) {
- return "";
- }
- var base64test = /[^A-Za-z0-9\+\/\=]/g;
- if (base64test.exec(input)) {
- return "";
- }
- do {
- enc1 = keyStr.indexOf(input.charAt(i++));
- enc2 = keyStr.indexOf(input.charAt(i++));
- enc3 = keyStr.indexOf(input.charAt(i++));
- enc4 = keyStr.indexOf(input.charAt(i++));
- chr1 = (enc1 << 2) | (enc2 >> 4);
- chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
- chr3 = ((enc3 & 3) << 6) | enc4;
- output = output + String.fromCharCode(chr1);
- if (enc3 != 64) {
- output += String.fromCharCode(chr2);
- }
- if (enc4 != 64) {
- output += String.fromCharCode(chr3);
- }
- chr1 = chr2 = chr3 = "";
- enc1 = enc2 = enc3 = enc4 = "";
- } while ( i < input . length );
- return output;
- }
- function utf16to8(str) {
- var out, i, len, c;
- out = "";
- len = str.length;
- for (i = 0; i < len; i++) {
- c = str.charCodeAt(i);
- if ((c >= 0x0001) && (c <= 0x007F)) {
- out += str.charAt(i);
- } else if (c > 0x07FF) {
- out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
- out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
- out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
- } else {
- out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
- out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
- }
- }
- return out;
- }
- function utf8to16(str) {
- var out, i, len, c;
- var char2, char3;
- out = "";
- len = str.length;
- i = 0;
- while (i < len) {
- c = str.charCodeAt(i++);
- switch (c >> 4) {
- case 0:
- case 1:
- case 2:
- case 3:
- case 4:
- case 5:
- case 6:
- case 7:
- // 0xxxxxxx
- out += str.charAt(i - 1);
- break;
- case 12:
- case 13:
- // 110x xxxx 10xx xxxx
- char2 = str.charCodeAt(i++);
- out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
- break;
- case 14:
- // 1110 xxxx 10xx xxxx 10xx xxxx
- char2 = str.charCodeAt(i++);
- char3 = str.charCodeAt(i++);
- out += String.fromCharCode(((c & 0x0F) << 12) | ((char2 & 0x3F) << 6) | ((char3 & 0x3F) << 0));
- break;
- }
- }
- return out;
- }
- // 测试代码 开始
- var de = encode64(utf16to8("select 用户名 from 用户"));
- document.writeln(de + "<br>");
- var ee = utf8to16(decode64(de)) document.writeln(ee);
- // 测试代码 结束
- //-->
- </script>
- </head>
- <body>
- </body>
- </html>
上面的代码都是从网上得来,拼凑后得到正确结果,在此感谢前辈们
PS:这里再为大家推荐几款 base64 编码解码在线工具,相信在以后的开发中会用得到:
希望本文所述对大家 Javascript 程序设计有所帮助。
来源: http://www.phperz.com/article/17/0714/264670.html