文档章节

jquery.base64.js支持中文

 夏碌冬藏
发布于 2017/04/28 21:51
字数 1094
阅读 63
收藏 0

@阿阮 在https://my.oschina.net/aruan/blog/418980写道支持中文,但是缺少了东西“"use strict";”在测试时,发现有很多关于jquery.base64.js的库,最后发现@阿阮 兄是从https://github.com/carlo/jquery-base64这里修改来的,现在放出可用的源码。

    使用方法:

<html>

<head>
    <title></title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
    <script language="javascript" src="js/jquery-1.11.3.min.js"></script>
    <script language="javascript" src="js/jquery.base64.cn.js"></script>
</head>

<body>
    <input id="path" name="path" type="hidden" value="haha"></input>
    <input id="putcardno01" name="putcardno01" type="text" size="65" value=""></input>
    <br>
    <input onclick="subfunc();" class="btn1" value="提交加密" type="button"></input>
    <br> 加密后:
    <input id="putcardno02" name="putcardno02" type="text" size="65" value=""></input>
    <br>
    <input onclick="subfunc02();" class="btn1" value="提交解密" type="button"></input>
    <br>
    <br>
    <hr>
    <input onclick="subfunc03();" class="btn1" value="提交N次加密" type="button"></input>
    <br> 加密后:
    <input id="putcardno03" name="putcardno03" type="text" size="65" value=""></input>
    <br>
    <input onclick="subfunc04();" class="btn1" value="提交N次解密" type="button"></input>
    <br>
    <br>
    <input onclick="clearrr();" class="btn1" value="清除" type="button"></input>
    <br>
    <textarea id='txt' cols="75" rows="19"></textarea>
</body>
<script language="javascript">
var path = document.getElementById("path").value;

function app(info) {
    $("#txt").val($("#txt").val() + '\n' + info);
}



function subfunc() {
    var put1 = $.trim($("#putcardno01").val());
    // var estxt=$.base64.encode(put1);
    //var estxt=$.base64.btoa(put1);

    var estxt = encodeBase64(put1);
    $("#putcardno02").val(estxt);
    app("加密后[" + estxt + "]");
}



function subfunc02() {
    var put1 = $.trim($("#putcardno02").val());
    //var estxt=$.base64.decode(put1);
    //var estxt=$.base64.atob(put1);

    var estxt = decodeBase64(put1);
    app("解密后[" + estxt + "]");
}


//////////////////////////////////////////
var numTimes = 5;

function subfunc03() {
    var put1 = $.trim($("#putcardno01").val());
    // var estxt=$.base64.encode(put1);
    //var estxt=$.base64.btoa(put1);
    //estxt=$.base64.btoa(estxt);

    estxt = encodeBase64(put1, numTimes);

    $("#putcardno03").val(estxt);
    app(numTimes + "次加密后[" + estxt + "]");
}



function subfunc04() {
    var put1 = $.trim($("#putcardno03").val());
    //var estxt=$.base64.decode(put1);
    //var estxt=$.base64.atob(put1);
    //estxt=$.base64.atob(estxt);


    estxt = decodeBase64(put1, numTimes);
    app(numTimes + "次解密后[" + estxt + "]");
}


function clearrr() {
    $("#putcardno02").val("");
    $("#putcardno03").val("");
    $("#putcardno04").val("");
    $("#txt").val("");
}













//加密方法。没有过滤首尾空格,即没有trim.
//加密可以加密N次,对应解密N次就可以获取明文
function encodeBase64(mingwen, times) {
    var code = "";
    var num = 1;
    if (typeof times == 'undefined' || times == null || times == "") {
        num = 1;
    } else {
        var vt = times + "";
        num = parseInt(vt);
    }

    if (typeof mingwen == 'undefined' || mingwen == null || mingwen == "") {

    } else {
        code = mingwen;
        for (var i = 0; i < num; i++) {
            code = $.base64.encode(code);
            // code = $.base64({data:code,type:0});
        }
    }
    return code;
}


//解密方法。没有过滤首尾空格,即没有trim
//加密可以加密N次,对应解密N次就可以获取明文
function decodeBase64(mi, times) {
    var mingwen = "";
    var num = 1;
    if (typeof times == 'undefined' || times == null || times == "") {
        num = 1;
    } else {
        var vt = times + "";
        num = parseInt(vt);
    }


    if (typeof mi == 'undefined' || mi == null || mi == "") {

    } else {
        mingwen = mi;
        for (var i = 0; i < num; i++) {
            mingwen = $.base64.decode(mingwen);
            // mingwen = $.base64({data:mingwen,type:1,unicode:false});
        }
    }
    return mingwen;
}


/*
测试
输入 suolong2014version


加密后[c3VvbG9uZzIwMTR2ZXJzaW9u]
解密后[suolong2014version]
5次加密后[VjFod1QxWXlVblJUYTJoUVYwWmFhRnBYZEhOTk1WSlhWV3hPVG1KSVFscFZNalYzWVVaYU5tSkVSVDA9]
5次解密后[suolong2014version]
*/
</script>

    源码:

//支持中文的jquery.base64.js插件
"use strict";
jQuery.base64 = (function($) {

    var _PADCHAR = "=",
        _ALPHA = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
        _VERSION = "1.1"; //Mr. Ruan fix to 1.1 to support asian char(utf8)


    function _getbyte64(s, i) {
        // This is oddly fast, except on Chrome/V8.
        // Minimal or no improvement in performance by using a
        // object with properties mapping chars to value (eg. 'A': 0)

        var idx = _ALPHA.indexOf(s.charAt(i));

        if (idx === -1) {
            throw "Cannot decode base64";
        }

        return idx;
    }

    function _decode_chars(y, x) {
        while (y.length > 0) {
            var ch = y[0];
            if (ch < 0x80) {
                y.shift();
                x.push(String.fromCharCode(ch));
            } else if ((ch & 0x80) == 0xc0) {
                if (y.length < 2) break;
                ch = y.shift();
                var ch1 = y.shift();
                x.push(String.fromCharCode(((ch & 0x1f) << 6) + (ch1 & 0x3f)));
            } else {
                if (y.length < 3) break;
                ch = y.shift();
                var ch1 = y.shift();
                var ch2 = y.shift();
                x.push(String.fromCharCode(((ch & 0x0f) << 12) + ((ch1 & 0x3f) << 6) + (ch2 & 0x3f)));
            }
        }
    }

    function _decode(s) {
        var pads = 0,
            i,
            b10,
            imax = s.length,
            x = [],
            y = [];

        s = String(s);

        if (imax === 0) {
            return s;
        }

        if (imax % 4 !== 0) {
            throw "Cannot decode base64";
        }

        if (s.charAt(imax - 1) === _PADCHAR) {
            pads = 1;

            if (s.charAt(imax - 2) === _PADCHAR) {
                pads = 2;
            }

            // either way, we want to ignore this last block
            imax -= 4;
        }

        for (i = 0; i < imax; i += 4) {
            var ch1 = _getbyte64(s, i);
            var ch2 = _getbyte64(s, i + 1);
            var ch3 = _getbyte64(s, i + 2);
            var ch4 = _getbyte64(s, i + 3);

            b10 = (_getbyte64(s, i) << 18) | (_getbyte64(s, i + 1) << 12) | (_getbyte64(s, i + 2) << 6) | _getbyte64(s, i + 3);
            y.push(b10 >> 16);
            y.push((b10 >> 8) & 0xff);
            y.push(b10 & 0xff);
            _decode_chars(y, x);
        }
        switch (pads) {
            case 1:
                b10 = (_getbyte64(s, i) << 18) | (_getbyte64(s, i + 1) << 12) | (_getbyte64(s, i + 2) << 6);
                y.push(b10 >> 16);
                y.push((b10 >> 8) & 0xff);
                break;

            case 2:
                b10 = (_getbyte64(s, i) << 18) | (_getbyte64(s, i + 1) << 12);
                y.push(b10 >> 16);
                break;
        }
        _decode_chars(y, x);
        if (y.length > 0) throw "Cannot decode base64";
        return x.join("");
    }


    function _get_chars(ch, y) {
        if (ch < 0x80) y.push(ch);
        else if (ch < 0x800) {
            y.push(0xc0 + ((ch >> 6) & 0x1f));
            y.push(0x80 + (ch & 0x3f));
        } else {
            y.push(0xe0 + ((ch >> 12) & 0xf));
            y.push(0x80 + ((ch >> 6) & 0x3f));
            y.push(0x80 + (ch & 0x3f));
        }
    }



    function _encode(s) {
        if (arguments.length !== 1) {
            throw "SyntaxError: exactly one argument required";
        }

        s = String(s);
        if (s.length === 0) {
            return s;
        }

        //s = _encode_utf8(s);
        var i,
            b10,
            y = [],
            x = [],
            len = s.length;
        i = 0;
        while (i < len) {
            _get_chars(s.charCodeAt(i), y);
            while (y.length >= 3) {
                var ch1 = y.shift();
                var ch2 = y.shift();
                var ch3 = y.shift();
                b10 = (ch1 << 16) | (ch2 << 8) | ch3;
                x.push(_ALPHA.charAt(b10 >> 18));
                x.push(_ALPHA.charAt((b10 >> 12) & 0x3F));
                x.push(_ALPHA.charAt((b10 >> 6) & 0x3f));
                x.push(_ALPHA.charAt(b10 & 0x3f));
            }
            i++;
        }


        switch (y.length) {
            case 1:
                var ch = y.shift();
                b10 = ch << 16;
                x.push(_ALPHA.charAt(b10 >> 18) + _ALPHA.charAt((b10 >> 12) & 0x3F) + _PADCHAR + _PADCHAR);
                break;

            case 2:
                var ch1 = y.shift();
                var ch2 = y.shift();
                b10 = (ch1 << 16) | (ch2 << 8);
                x.push(_ALPHA.charAt(b10 >> 18) + _ALPHA.charAt((b10 >> 12) & 0x3F) + _ALPHA.charAt((b10 >> 6) & 0x3f) + _PADCHAR);
                break;
        }

        return x.join("");
    }


    return {
        decode: _decode,
        encode: _encode,
        VERSION: _VERSION
    };
}(jQuery));

 

 

© 著作权归作者所有

共有 人打赏支持
粉丝 9
博文 52
码字总数 12432
作品 0
赣州
后端工程师
私信 提问
jquery.base64.js的修正

深圳一朋友说使用jquery.base64.js时发现对于中文直接抛出异常,作者压根不处理汉字的情况,因此 对其进行修正,关键函数为: function decodechars(y, x){ while(y.length > 0){ var ch = ...

阿阮
2015/05/23
0
9
Collabtive 0.76 中文修复版首发下载

Collabtive 0.76 中文修复版,修复4个问题: install.php里的SQL语句创建表不支持中文,数据库记录显示中文乱码; 项目文件管理的中文汉化、语言配置文件遗留问题; 不支持创建中文目录和上传...

庞罗均
2012/07/03
0
0
Hyperic HQ简体中文汉化包完整版

Hyperic HQ简体中文汉化包完整版: 区别于Hyperic HQ 中文汉化包基础版,Hyepric HQ 中文汉化包完整版的特性包括: 全面的 ApplicationResource.properties汉化 全部的 JSP汉化 Hyperic HQ 中...

liuyifeng
2011/03/16
3.1K
4
Google 云输入法登陆 Google Translate

去年年底 Google Transliterate 开始支持简体中文,今年三月其 API 再次更新,支持了使用 Bookmarklet 在任何网页中使用谷歌云输入法输入中文。而今天,谷歌输入法团队将中文的云输入法引入了...

老枪
2011/05/19
1K
7
谷歌翻译开始支持中文发音

谷歌翻译(Google Translate)尽管很早就支持了中文语言,而且也有了翻译结果发音功能,但是一直没有中文的发音支持,不得不说是一个遗憾。而如今谷歌的这个缺陷也 终于得到了弥补。目前根据...

红薯
2010/05/12
1K
3

没有更多内容

加载失败,请刷新页面

加载更多

【阿里面试系列】之前有人问过我一个这样的面试题

文章简介 很多人对Thread.join的作用以及实现了解得很少,毕竟这个api我们很少使用。这篇文章仍然会结合使用及原理进行深度分析 扩展阅读: 「阿里面试系列」搞懂并发编程,轻松应对80%的面试...

Java架构资源分享
2分钟前
0
0
CentOS 7.2 yum方式安装MySQL 5.7

CentOS 7.2 yum方式安装MySQL 5.7 CentOS 7之后的版本yum的默认源中使用MariaDB替代原先MySQL,因此安装方式较为以往有一些改变: 下载mysql的源 wget http://dev.mysql.com/get/mysql57-co...

yizhichao
2分钟前
0
0
nginx-tutorial

Nginx 本项目是一个 Nginx 极简教程,目的在于帮助新手快速入门 Nginx。 demos 目录中的示例模拟了工作中的一些常用实战场景,并且都可以通过脚本一键式启动,让您可以快速看到演示效果。 <!...

吴伟祥
3分钟前
0
0
分布式系统下的Session共享问题

分布式系统下的Session共享问题 分布式服务器有多台,用nginx做负载均衡,这样同一个IP访问同一个页面会被分配到不同的服务器上,如果session不同步的话,就会出现很多问题,比如说最常见的登...

晨猫
8分钟前
0
0
2018 中国短视频开发者创意大赛震撼来袭,万元现金大奖邀你来战!

当下,短视频 App 已成为各个年龄层最火最潮的应用,而在短视频行业发展如火如荼时,又掀起了一轮潮流新玩法的探讨,为短视频新形势下提供更多可能性。2018 年 12 月 3 日,中国短视频开发者...

七牛云
11分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部