1 ;'use strict'; 2 3 /** 4 * @author Rui.Zhang 5 * @class 前端开发辅助工具类 6 * @date 2016-09-04 22:32:09 7 * @description Mtils 是 My Utils 的简写, 本工具提供前台常用的文本处理、 表单处理、 数据校验、 数据安全等函数。<br /> 8 * @description 除了基本的函数封装外, 本工具还对原生的对象进行一定的扩展, 更方便使用。 9 * @site https://github.com/MisterChangRay/Mtils2 10 * @since version 2.0.0 11 */ 12 window.Mtils = { 13 /** 14 * @author Rui.Zhang 15 * @class 常量类 16 * @description 提供一些常量 17 */ 18 constant : { 19 /** 20 * @description 常用键盘控制键常量 21 */ 22 CONTROL_KEY : { 23 BACK_SPACE:8, TAB:9, ENTER:13, SHIFT:16, CTRL:17, ALT:18, CAPS_LOCK:20, ESC:27, 24 SPACE:32, END:35, HOME:36, INSERT:45, PAGE_UP:33, PAGE_DOWN:34, DELETE:46, CONTEXT_MENU:93, 25 8: "BACK_SPACE", 9 : "TAB", 13 : "ENTER", 16 : "SHIFT", 17 : "CTRL", 18 : "ALT", 20:"CAPS_LOCK", 27:"ESC", 26 32:"SPACE", 35:"END", 36:"HOME", 45:"INSERT", 33:"PAGE_UP", 34:"PAGE_DOWN", 46:"DELETE", 93:"CONTEXT_MENU", 27 }, 28 /** 29 * @description 性别常量女(0) 30 */ 31 WOMAN : 0, 32 /** 33 * @description 性别常量男(1) 34 */ 35 MAN : 1, 36 /** 37 * @description 进制转换基础数据 38 */ 39 BASE_DECIMAL : "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_@", 40 /** 41 * @description 拼音转换基础数据 42 */ 43 PY_MAPS : {"a":"\u554a\u963f\u9515","ai":"\u57c3\u6328\u54ce\u5509\u54c0\u7691\u764c\u853c\u77ee\u827e\u788d\u7231\u9698\u8bf6\u6371\u55f3\u55cc\u5ad2\u7477\u66a7\u7839\u953f\u972d","an":"\u978d\u6c28\u5b89\u4ffa\u6309\u6697\u5cb8\u80fa\u6848\u8c19\u57ef\u63de\u72b4\u5eb5\u6849\u94f5\u9e4c\u9878\u9eef","ang":"\u80ae\u6602\u76ce","ao":"\u51f9\u6556\u71ac\u7ff1\u8884\u50b2\u5965\u61ca\u6fb3\u5773\u62d7\u55f7\u5662\u5c99\u5ed2\u9068\u5aaa\u9a9c\u8071\u87af\u93ca\u9ccc\u93d6","ba":"\u82ad\u634c\u6252\u53ed\u5427\u7b06\u516b\u75a4\u5df4\u62d4\u8dcb\u9776\u628a\u8019\u575d\u9738\u7f62\u7238\u8307\u83dd\u8406\u636d\u5c9c\u705e\u6777\u94af\u7c91\u9c85\u9b43","bai":"\u767d\u67cf\u767e\u6446\u4f70\u8d25\u62dc\u7a17\u859c\u63b0\u97b4","ban":"\u6591\u73ed\u642c\u6273\u822c\u9881\u677f\u7248\u626e\u62cc\u4f34\u74e3\u534a\u529e\u7eca\u962a\u5742\u8c73\u94a3\u7622\u764d\u8228","bang":"\u90a6\u5e2e\u6886\u699c\u8180\u7ed1\u68d2\u78c5\u868c\u9551\u508d\u8c24\u84a1\u8783","bao":"\u82de\u80de\u5305\u8912\u96f9\u4fdd\u5821\u9971\u5b9d\u62b1\u62a5\u66b4\u8c79\u9c8d\u7206\u52f9\u8446\u5b80\u5b62\u7172\u9e28\u8913\u8db5\u9f85","bo":"\u5265\u8584\u73bb\u83e0\u64ad\u62e8\u94b5\u6ce2\u535a\u52c3\u640f\u94c2\u7b94\u4f2f\u5e1b\u8236\u8116\u818a\u6e24\u6cca\u9a73\u4eb3\u8543\u5575\u997d\u6a97\u64d8\u7934\u94b9\u9e41\u7c38\u8ddb","bei":"\u676f\u7891\u60b2\u5351\u5317\u8f88\u80cc\u8d1d\u94a1\u500d\u72c8\u5907\u60eb\u7119\u88ab\u5b5b\u9642\u90b6\u57e4\u84d3\u5457\u602b\u6096\u789a\u9e4e\u8919\u943e","ben":"\u5954\u82ef\u672c\u7b28\u755a\u574c\u951b","beng":"\u5d29\u7ef7\u752d\u6cf5\u8e66\u8ff8\u552a\u5623\u750f","bi":"\u903c\u9f3b\u6bd4\u9119\u7b14\u5f7c\u78a7\u84d6\u853d\u6bd5\u6bd9\u6bd6\u5e01\u5e87\u75f9\u95ed\u655d\u5f0a\u5fc5\u8f9f\u58c1\u81c2\u907f\u965b\u5315\u4ef3\u4ffe\u8298\u835c\u8378\u5421\u54d4\u72f4\u5eb3\u610e\u6ed7\u6fde\u5f3c\u59a3\u5a62\u5b16\u74a7\u8d32\u7540\u94cb\u79d5\u88e8\u7b5a\u7b85\u7be6\u822d\u895e\u8df8\u9ac0","bian":"\u97ad\u8fb9\u7f16\u8d2c\u6241\u4fbf\u53d8\u535e\u8fa8\u8fa9\u8fab\u904d\u533e\u5f01\u82c4\u5fed\u6c74\u7f0f\u7178\u782d\u78a5\u7a39\u7a86\u8759\u7b3e\u9cca","biao":"\u6807\u5f6a\u8198\u8868\u5a4a\u9aa0\u98d1\u98d9\u98da\u706c\u9556\u9573\u762d\u88f1\u9cd4","bie":"\u9cd6\u618b\u522b\u762a\u8e69\u9cd8","bin":"\u5f6c\u658c\u6fd2\u6ee8\u5bbe\u6448\u50a7\u6d5c\u7f24\u73a2\u6ba1\u8191\u9554\u9acc\u9b13","bing":"\u5175\u51b0\u67c4\u4e19\u79c9\u997c\u70b3\u75c5\u5e76\u7980\u90b4\u6452\u7ee0\u678b\u69df\u71f9","bu":"\u6355\u535c\u54fa\u8865\u57e0\u4e0d\u5e03\u6b65\u7c3f\u90e8\u6016\u62ca\u535f\u900b\u74ff\u6661\u949a\u91ad","ca":"\u64e6\u5693\u7924","cai":"\u731c\u88c1\u6750\u624d\u8d22\u776c\u8e29\u91c7\u5f69\u83dc\u8521","can":"\u9910\u53c2\u8695\u6b8b\u60ed\u60e8\u707f\u9a96\u74a8\u7cb2\u9eea","cang":"\u82cd\u8231\u4ed3\u6ca7\u85cf\u4f27","cao":"\u64cd\u7cd9\u69fd\u66f9\u8349\u8279\u5608\u6f15\u87ac\u825a","ce":"\u5395\u7b56\u4fa7\u518c\u6d4b\u5202\u5e3b\u607b","ceng":"\u5c42\u8e6d\u564c","cha":"\u63d2\u53c9\u832c\u8336\u67e5\u78b4\u643d\u5bdf\u5c94\u5dee\u8be7\u7339\u9987\u6c4a\u59f9\u6748\u6942\u69ce\u6aab\u9497\u9538\u9572\u8869","chai":"\u62c6\u67f4\u8c7a\u4faa\u8308\u7625\u867f\u9f87","chan":"\u6400\u63ba\u8749\u998b\u8c17\u7f20\u94f2\u4ea7\u9610\u98a4\u5181\u8c04\u8c36\u8487\u5edb\u5fcf\u6f7a\u6fb6\u5b71\u7fbc\u5a75\u5b17\u9aa3\u89c7\u7985\u9561\u88e3\u87fe\u8e94","chang":"\u660c\u7316\u573a\u5c1d\u5e38\u957f\u507f\u80a0\u5382\u655e\u7545\u5531\u5021\u4f25\u9b2f\u82cc\u83d6\u5f9c\u6005\u60dd\u960a\u5a3c\u5ae6\u6636\u6c05\u9cb3","chao":"\u8d85\u6284\u949e\u671d\u5632\u6f6e\u5de2\u5435\u7092\u600a\u7ec9\u6641\u8016","che":"\u8f66\u626f\u64a4\u63a3\u5f7b\u6f88\u577c\u5c6e\u7817","chen":"\u90f4\u81e3\u8fb0\u5c18\u6668\u5ff1\u6c89\u9648\u8d81\u886c\u79f0\u8c0c\u62bb\u55d4\u5bb8\u741b\u6987\u809c\u80c2\u789c\u9f80","cheng":"\u6491\u57ce\u6a59\u6210\u5448\u4e58\u7a0b\u60e9\u6f84\u8bda\u627f\u901e\u9a8b\u79e4\u57d5\u5d4a\u5fb5\u6d48\u67a8\u67fd\u6a18\u665f\u584d\u77a0\u94d6\u88ce\u86cf\u9172","chi":"\u5403\u75f4\u6301\u5319\u6c60\u8fdf\u5f1b\u9a70\u803b\u9f7f\u4f88\u5c3a\u8d64\u7fc5\u65a5\u70bd\u50ba\u5880\u82aa\u830c\u640b\u53f1\u54e7\u557b\u55e4\u5f73\u996c\u6cb2\u5ab8\u6555\u80dd\u7719\u7735\u9e31\u761b\u892b\u86a9\u87ad\u7b1e\u7bea\u8c49\u8e05\u8e1f\u9b51","chong":"\u5145\u51b2\u866b\u5d07\u5ba0\u833a\u5fe1\u61a7\u94f3\u825f","chou":"\u62bd\u916c\u7574\u8e0c\u7a20\u6101\u7b79\u4ec7\u7ef8\u7785\u4e11\u4fe6\u5733\u5e31\u60c6\u6eb4\u59af\u7633\u96e0\u9c8b","chu":"\u81ed\u521d\u51fa\u6a71\u53a8\u8e87\u9504\u96cf\u6ec1\u9664\u695a\u7840\u50a8\u77d7\u6410\u89e6\u5904\u4e8d\u520d\u61b7\u7ecc\u6775\u696e\u6a17\u870d\u8e70\u9edc","chuan":"\u63e3\u5ddd\u7a7f\u693d\u4f20\u8239\u5598\u4e32\u63be\u821b\u60f4\u9044\u5ddb\u6c1a\u948f\u9569\u8221","chuang":"\u75ae\u7a97\u5e62\u5e8a\u95ef\u521b\u6006","chui":"\u5439\u708a\u6376\u9524\u5782\u9672\u68f0\u69cc","chun":"\u6625\u693f\u9187\u5507\u6df3\u7eaf\u8822\u4fc3\u83bc\u6c8c\u80ab\u6710\u9e51\u877d","chuo":"\u6233\u7ef0\u851f\u8fb6\u8f8d\u955e\u8e14\u9f8a","ci":"\u75b5\u8328\u78c1\u96cc\u8f9e\u6148\u74f7\u8bcd\u6b64\u523a\u8d50\u6b21\u8360\u5472\u5d6f\u9e5a\u8785\u7ccd\u8d91","cong":"\u806a\u8471\u56f1\u5306\u4ece\u4e1b\u506c\u82c1\u6dd9\u9aa2\u742e\u7481\u679e","cu":"\u51d1\u7c97\u918b\u7c07\u731d\u6b82\u8e59","cuan":"\u8e7f\u7be1\u7a9c\u6c46\u64ba\u6615\u7228","cui":"\u6467\u5d14\u50ac\u8106\u7601\u7cb9\u6dec\u7fe0\u8403\u60b4\u7480\u69b1\u96b9","cun":"\u6751\u5b58\u5bf8\u78cb\u5fd6\u76b4","cuo":"\u64ae\u6413\u63aa\u632b\u9519\u539d\u811e\u9509\u77ec\u75e4\u9e7e\u8e49\u8e9c","da":"\u642d\u8fbe\u7b54\u7629\u6253\u5927\u8037\u54d2\u55d2\u601b\u59b2\u75b8\u8921\u7b2a\u977c\u9791","dai":"\u5446\u6b79\u50a3\u6234\u5e26\u6b86\u4ee3\u8d37\u888b\u5f85\u902e\u6020\u57ed\u7519\u5454\u5cb1\u8fe8\u902f\u9a80\u7ed0\u73b3\u9edb","dan":"\u803d\u62c5\u4e39\u5355\u90f8\u63b8\u80c6\u65e6\u6c2e\u4f46\u60ee\u6de1\u8bde\u5f39\u86cb\u4ebb\u510b\u5369\u840f\u5556\u6fb9\u6a90\u6b9a\u8d55\u7708\u7605\u8043\u7baa","dang":"\u5f53\u6321\u515a\u8361\u6863\u8c20\u51fc\u83ea\u5b95\u7800\u94db\u88c6","dao":"\u5200\u6363\u8e48\u5012\u5c9b\u7977\u5bfc\u5230\u7a3b\u60bc\u9053\u76d7\u53e8\u5541\u5fc9\u6d2e\u6c18\u7118\u5fd1\u7e9b","de":"\u5fb7\u5f97\u7684\u951d","deng":"\u8e6c\u706f\u767b\u7b49\u77aa\u51f3\u9093\u5654\u5d9d\u6225\u78f4\u956b\u7c26","di":"\u5824\u4f4e\u6ef4\u8fea\u654c\u7b1b\u72c4\u6da4\u7fdf\u5ae1\u62b5\u5e95\u5730\u8482\u7b2c\u5e1d\u5f1f\u9012\u7f14\u6c10\u7c74\u8bcb\u8c1b\u90b8\u577b\u839c\u837b\u5600\u5a23\u67e2\u68e3\u89cc\u7825\u78b2\u7747\u955d\u7f9d\u9ab6","dian":"\u98a0\u6382\u6ec7\u7898\u70b9\u5178\u975b\u57ab\u7535\u4f43\u7538\u5e97\u60e6\u5960\u6dc0\u6bbf\u4e36\u963d\u576b\u57dd\u5dc5\u73b7\u765c\u766b\u7c1f\u8e2e","diao":"\u7889\u53fc\u96d5\u51cb\u5201\u6389\u540a\u9493\u8c03\u8f7a\u94de\u8729\u7c9c\u8c82","die":"\u8dcc\u7239\u789f\u8776\u8fed\u8c0d\u53e0\u4f5a\u57a4\u581e\u63f2\u558b\u6e2b\u8f76\u7252\u74de\u8936\u800b\u8e40\u9cbd\u9cce","ding":"\u4e01\u76ef\u53ee\u9489\u9876\u9f0e\u952d\u5b9a\u8ba2\u4e22\u4ec3\u5576\u738e\u815a\u7887\u753a\u94e4\u7594\u8035\u914a","dong":"\u4e1c\u51ac\u8463\u61c2\u52a8\u680b\u4f97\u606b\u51bb\u6d1e\u578c\u549a\u5cbd\u5cd2\u5902\u6c21\u80e8\u80f4\u7850\u9e2b","dou":"\u515c\u6296\u6597\u9661\u8c46\u9017\u75d8\u8538\u94ad\u7aa6\u7aac\u86aa\u7bfc\u9161","du":"\u90fd\u7763\u6bd2\u728a\u72ec\u8bfb\u5835\u7779\u8d4c\u675c\u9540\u809a\u5ea6\u6e21\u5992\u828f\u561f\u6e0e\u691f\u6a50\u724d\u8839\u7b03\u9ad1\u9ee9","duan":"\u7aef\u77ed\u953b\u6bb5\u65ad\u7f0e\u5f56\u6934\u7145\u7c16","dui":"\u5806\u5151\u961f\u5bf9\u603c\u619d\u7893","dun":"\u58a9\u5428\u8e72\u6566\u987f\u56e4\u949d\u76fe\u9041\u7096\u7818\u7905\u76f9\u9566\u8db8","duo":"\u6387\u54c6\u591a\u593a\u579b\u8eb2\u6735\u8dfa\u8235\u5241\u60f0\u5815\u5484\u54da\u7f0d\u67c1\u94ce\u88f0\u8e31","e":"\u86fe\u5ce8\u9e45\u4fc4\u989d\u8bb9\u5a25\u6076\u5384\u627c\u904f\u9102\u997f\u5669\u8c14\u57a9\u57ad\u82ca\u83aa\u843c\u5443\u6115\u5c59\u5a40\u8f6d\u66f7\u816d\u786a\u9507\u9537\u9e57\u989a\u9cc4","en":"\u6069\u84bd\u6441\u5514\u55ef","er":"\u800c\u513f\u8033\u5c14\u9975\u6d31\u4e8c\u8d30\u8fe9\u73e5\u94d2\u9e38\u9c95","fa":"\u53d1\u7f5a\u7b4f\u4f10\u4e4f\u9600\u6cd5\u73d0\u57a1\u781d","fan":"\u85e9\u5e06\u756a\u7ffb\u6a0a\u77fe\u9492\u7e41\u51e1\u70e6\u53cd\u8fd4\u8303\u8d29\u72af\u996d\u6cdb\u8629\u5e61\u72ad\u68b5\u6535\u71d4\u7548\u8e6f","fang":"\u574a\u82b3\u65b9\u80aa\u623f\u9632\u59a8\u4eff\u8bbf\u7eba\u653e\u531a\u90a1\u5f77\u94ab\u822b\u9c82","fei":"\u83f2\u975e\u5561\u98de\u80a5\u532a\u8bfd\u5420\u80ba\u5e9f\u6cb8\u8d39\u82be\u72d2\u60b1\u6ddd\u5983\u7ecb\u7eef\u69a7\u8153\u6590\u6249\u7953\u7829\u9544\u75f1\u871a\u7bda\u7fe1\u970f\u9cb1","fen":"\u82ac\u915a\u5429\u6c1b\u5206\u7eb7\u575f\u711a\u6c7e\u7c89\u594b\u4efd\u5fff\u6124\u7caa\u507e\u7035\u68fc\u610d\u9cbc\u9f22","feng":"\u4e30\u5c01\u67ab\u8702\u5cf0\u950b\u98ce\u75af\u70fd\u9022\u51af\u7f1d\u8bbd\u5949\u51e4\u4ff8\u9146\u8451\u6ca3\u781c","fu":"\u4f5b\u5426\u592b\u6577\u80a4\u5b75\u6276\u62c2\u8f90\u5e45\u6c1f\u7b26\u4f0f\u4fd8\u670d\u6d6e\u6daa\u798f\u88b1\u5f17\u752b\u629a\u8f85\u4fef\u91dc\u65a7\u812f\u8151\u5e9c\u8150\u8d74\u526f\u8986\u8d4b\u590d\u5085\u4ed8\u961c\u7236\u8179\u8d1f\u5bcc\u8ba3\u9644\u5987\u7f1a\u5490\u5310\u51eb\u90db\u8299\u82fb\u832f\u83a9\u83d4\u544b\u5e5e\u6ecf\u8274\u5b5a\u9a78\u7ec2\u6874\u8d59\u9efb\u9efc\u7f58\u7a03\u99a5\u864d\u86a8\u8709\u8760\u876e\u9eb8\u8dba\u8dd7\u9cc6","ga":"\u5676\u560e\u86e4\u5c2c\u5477\u5c15\u5c1c\u65ee\u9486","gai":"\u8be5\u6539\u6982\u9499\u76d6\u6e89\u4e10\u9654\u5793\u6224\u8d45\u80f2","gan":"\u5e72\u7518\u6746\u67d1\u7aff\u809d\u8d76\u611f\u79c6\u6562\u8d63\u5769\u82f7\u5c34\u64c0\u6cd4\u6de6\u6f89\u7ec0\u6a44\u65f0\u77f8\u75b3\u9150","gang":"\u5188\u521a\u94a2\u7f38\u809b\u7eb2\u5c97\u6e2f\u6206\u7f61\u9883\u7b7b","gong":"\u6760\u5de5\u653b\u529f\u606d\u9f9a\u4f9b\u8eac\u516c\u5bab\u5f13\u5de9\u6c5e\u62f1\u8d21\u5171\u857b\u5efe\u54a3\u73d9\u80b1\u86a3\u86e9\u89e5","gao":"\u7bd9\u768b\u9ad8\u818f\u7f94\u7cd5\u641e\u9550\u7a3f\u544a\u777e\u8bf0\u90dc\u84bf\u85c1\u7f1f\u69d4\u69c1\u6772\u9506","ge":"\u54e5\u6b4c\u6401\u6208\u9e3d\u80f3\u7599\u5272\u9769\u845b\u683c\u9601\u9694\u94ec\u4e2a\u5404\u9b32\u4ee1\u54ff\u5865\u55dd\u7ea5\u643f\u8188\u784c\u94ea\u9549\u88bc\u988c\u867c\u8238\u9abc\u9ac2","gei":"\u7ed9","gen":"\u6839\u8ddf\u4e98\u831b\u54cf\u826e","geng":"\u8015\u66f4\u5e9a\u7fb9\u57c2\u803f\u6897\u54fd\u8d53\u9ca0","gou":"\u94a9\u52fe\u6c9f\u82df\u72d7\u57a2\u6784\u8d2d\u591f\u4f5d\u8bdf\u5ca3\u9058\u5abe\u7f11\u89cf\u5f40\u9e32\u7b31\u7bdd\u97b2","gu":"\u8f9c\u83c7\u5495\u7b8d\u4f30\u6cbd\u5b64\u59d1\u9f13\u53e4\u86ca\u9aa8\u8c37\u80a1\u6545\u987e\u56fa\u96c7\u560f\u8bc2\u83f0\u54cc\u5d2e\u6c69\u688f\u8f71\u726f\u727f\u80cd\u81cc\u6bc2\u77bd\u7f5f\u94b4\u9522\u74e0\u9e2a\u9e44\u75fc\u86c4\u9164\u89da\u9cb4\u9ab0\u9e58","gua":"\u522e\u74dc\u5250\u5be1\u6302\u8902\u5366\u8bd6\u5471\u681d\u9e39","guai":"\u4e56\u62d0\u602a\u54d9","guan":"\u68fa\u5173\u5b98\u51a0\u89c2\u7ba1\u9986\u7f50\u60ef\u704c\u8d2f\u500c\u839e\u63bc\u6dab\u76e5\u9e73\u9ccf","guang":"\u5149\u5e7f\u901b\u72b7\u6844\u80f1\u7592","gui":"\u7470\u89c4\u572d\u7845\u5f52\u9f9f\u95fa\u8f68\u9b3c\u8be1\u7678\u6842\u67dc\u8dea\u8d35\u523d\u5326\u523f\u5e8b\u5b84\u59ab\u6867\u7085\u6677\u7688\u7c0b\u9c91\u9cdc","gun":"\u8f8a\u6eda\u68cd\u4e28\u886e\u7ef2\u78d9\u9ca7","guo":"\u9505\u90ed\u56fd\u679c\u88f9\u8fc7\u9998\u8803\u57da\u63b4\u5459\u56d7\u5e3c\u5d1e\u7313\u6901\u8662\u951e\u8052\u872e\u873e\u8748","ha":"\u54c8","hai":"\u9ab8\u5b69\u6d77\u6c26\u4ea5\u5bb3\u9a87\u54b4\u55e8\u988f\u91a2","han":"\u9163\u61a8\u90af\u97e9\u542b\u6db5\u5bd2\u51fd\u558a\u7f55\u7ff0\u64bc\u634d\u65f1\u61be\u608d\u710a\u6c57\u6c49\u9097\u83e1\u6496\u961a\u701a\u6657\u7113\u9894\u86b6\u9f3e","hen":"\u592f\u75d5\u5f88\u72e0\u6068","hang":"\u676d\u822a\u6c86\u7ed7\u73e9\u6841","hao":"\u58d5\u568e\u8c6a\u6beb\u90dd\u597d\u8017\u53f7\u6d69\u8585\u55e5\u5686\u6fe0\u704f\u660a\u7693\u98a2\u869d","he":"\u5475\u559d\u8377\u83cf\u6838\u79be\u548c\u4f55\u5408\u76d2\u8c89\u9602\u6cb3\u6db8\u8d6b\u8910\u9e64\u8d3a\u8bc3\u52be\u58d1\u85ff\u55d1\u55ec\u9616\u76cd\u86b5\u7fee","hei":"\u563f\u9ed1","heng":"\u54fc\u4ea8\u6a2a\u8861\u6052\u8a07\u8605","hong":"\u8f70\u54c4\u70d8\u8679\u9e3f\u6d2a\u5b8f\u5f18\u7ea2\u9ec9\u8ba7\u836d\u85a8\u95f3\u6cd3","hou":"\u5589\u4faf\u7334\u543c\u539a\u5019\u540e\u5820\u5f8c\u9005\u760a\u7bcc\u7cc7\u9c8e\u9aba","hu":"\u547c\u4e4e\u5ffd\u745a\u58f6\u846b\u80e1\u8774\u72d0\u7cca\u6e56\u5f27\u864e\u552c\u62a4\u4e92\u6caa\u6237\u51b1\u553f\u56eb\u5cb5\u7322\u6019\u60da\u6d52\u6ef9\u7425\u69f2\u8f77\u89f3\u70c0\u7173\u623d\u6248\u795c\u9e55\u9e71\u7b0f\u9190\u659b","hua":"\u82b1\u54d7\u534e\u733e\u6ed1\u753b\u5212\u5316\u8bdd\u5290\u6d4d\u9a85\u6866\u94e7\u7a1e","huai":"\u69d0\u5f8a\u6000\u6dee\u574f\u8fd8\u8e1d","huan":"\u6b22\u73af\u6853\u7f13\u6362\u60a3\u5524\u75ea\u8c62\u7115\u6da3\u5ba6\u5e7b\u90c7\u5942\u57b8\u64d0\u571c\u6d39\u6d63\u6f36\u5bf0\u902d\u7f33\u953e\u9ca9\u9b1f","huang":"\u8352\u614c\u9ec4\u78fa\u8757\u7c27\u7687\u51f0\u60f6\u714c\u6643\u5e4c\u604d\u8c0e\u968d\u5fa8\u6e5f\u6f62\u9051\u749c\u8093\u7640\u87e5\u7bc1\u9cc7","hui":"\u7070\u6325\u8f89\u5fbd\u6062\u86d4\u56de\u6bc1\u6094\u6167\u5349\u60e0\u6666\u8d3f\u79fd\u4f1a\u70e9\u6c47\u8bb3\u8bf2\u7ed8\u8bd9\u8334\u835f\u8559\u54d5\u5599\u96b3\u6d04\u5f57\u7f0b\u73f2\u6656\u605a\u867a\u87ea\u9ebe","hun":"\u8364\u660f\u5a5a\u9b42\u6d51\u6df7\u8be8\u9984\u960d\u6eb7\u7f17","huo":"\u8c41\u6d3b\u4f19\u706b\u83b7\u6216\u60d1\u970d\u8d27\u7978\u6509\u56af\u5925\u94ac\u952a\u956c\u8020\u8816","ji":"\u51fb\u573e\u57fa\u673a\u7578\u7a3d\u79ef\u7b95\u808c\u9965\u8ff9\u6fc0\u8ba5\u9e21\u59ec\u7ee9\u7f09\u5409\u6781\u68d8\u8f91\u7c4d\u96c6\u53ca\u6025\u75be\u6c72\u5373\u5ac9\u7ea7\u6324\u51e0\u810a\u5df1\u84df\u6280\u5180\u5b63\u4f0e\u796d\u5242\u60b8\u6d4e\u5bc4\u5bc2\u8ba1\u8bb0\u65e2\u5fcc\u9645\u5993\u7ee7\u7eaa\u5c45\u4e0c\u4e69\u525e\u4f76\u4f74\u8114\u58bc\u82a8\u82b0\u8401\u84ba\u857a\u638e\u53fd\u54ad\u54dc\u5527\u5c8c\u5d74\u6d0e\u5f50\u5c50\u9aa5\u757f\u7391\u696b\u6b9b\u621f\u6222\u8d4d\u89ca\u7284\u9f51\u77f6\u7f81\u5d47\u7a37\u7620\u7635\u866e\u7b08\u7b04\u66a8\u8dfb\u8dfd\u9701\u9c9a\u9cab\u9afb\u9e82","jia":"\u5609\u67b7\u5939\u4f73\u5bb6\u52a0\u835a\u988a\u8d3e\u7532\u94be\u5047\u7a3c\u4ef7\u67b6\u9a7e\u5ac1\u4f3d\u90cf\u62ee\u5cac\u6d43\u8fe6\u73c8\u621b\u80db\u605d\u94d7\u9553\u75c2\u86f1\u7b33\u8888\u8dcf","jian":"\u6b7c\u76d1\u575a\u5c16\u7b3a\u95f4\u714e\u517c\u80a9\u8270\u5978\u7f04\u8327\u68c0\u67ec\u78b1\u7877\u62e3\u6361\u7b80\u4fed\u526a\u51cf\u8350\u69db\u9274\u8df5\u8d31\u89c1\u952e\u7bad\u4ef6\u5065\u8230\u5251\u996f\u6e10\u6e85\u6da7\u5efa\u50ed\u8c0f\u8c2b\u83c5\u84b9\u641b\u56dd\u6e54\u8e47\u8b07\u7f23\u67a7\u67d9\u6957\u620b\u622c\u726e\u728d\u6bfd\u8171\u7751\u950f\u9e63\u88e5\u7b15\u7bb4\u7fe6\u8dbc\u8e3a\u9ca3\u97af","jiang":"\u50f5\u59dc\u5c06\u6d46\u6c5f\u7586\u848b\u6868\u5956\u8bb2\u5320\u9171\u964d\u8333\u6d1a\u7edb\u7f30\u729f\u7913\u8029\u7ce8\u8c47","jiao":"\u8549\u6912\u7901\u7126\u80f6\u4ea4\u90ca\u6d47\u9a84\u5a07\u56bc\u6405\u94f0\u77eb\u4fa5\u811a\u72e1\u89d2\u997a\u7f34\u7ede\u527f\u6559\u9175\u8f7f\u8f83\u53eb\u4f7c\u50ec\u832d\u6322\u564d\u5ce4\u5fbc\u59e3\u7e9f\u656b\u768e\u9e6a\u86df\u91ae\u8de4\u9c9b","jie":"\u7a96\u63ed\u63a5\u7686\u79f8\u8857\u9636\u622a\u52ab\u8282\u6854\u6770\u6377\u776b\u7aed\u6d01\u7ed3\u89e3\u59d0\u6212\u85c9\u82a5\u754c\u501f\u4ecb\u75a5\u8beb\u5c4a\u5048\u8ba6\u8bd8\u5588\u55df\u736c\u5a55\u5b51\u6840\u7352\u78a3\u9534\u7596\u88b7\u9889\u86a7\u7faf\u9c92\u9ab1\u9aeb","jin":"\u5dfe\u7b4b\u65a4\u91d1\u4eca\u6d25\u895f\u7d27\u9526\u4ec5\u8c28\u8fdb\u9773\u664b\u7981\u8fd1\u70ec\u6d78\u5c3d\u537a\u8369\u5807\u5664\u9991\u5ed1\u5997\u7f19\u747e\u69ff\u8d46\u89d0\u9485\u9513\u887f\u77dc","jing":"\u52b2\u8346\u5162\u830e\u775b\u6676\u9cb8\u4eac\u60ca\u7cbe\u7cb3\u7ecf\u4e95\u8b66\u666f\u9888\u9759\u5883\u656c\u955c\u5f84\u75c9\u9756\u7adf\u7ade\u51c0\u522d\u5106\u9631\u83c1\u734d\u61ac\u6cfe\u8ff3\u5f2a\u5a67\u80bc\u80eb\u8148\u65cc","jiong":"\u70af\u7a98\u5182\u8fe5\u6243","jiu":"\u63ea\u7a76\u7ea0\u7396\u97ed\u4e45\u7078\u4e5d\u9152\u53a9\u6551\u65e7\u81fc\u8205\u548e\u5c31\u759a\u50e6\u557e\u9604\u67e9\u6855\u9e6b\u8d73\u9b0f","ju":"\u97a0\u62d8\u72d9\u75bd\u9a79\u83ca\u5c40\u5480\u77e9\u4e3e\u6cae\u805a\u62d2\u636e\u5de8\u5177\u8ddd\u8e1e\u952f\u4ff1\u53e5\u60e7\u70ac\u5267\u5028\u8bb5\u82e3\u82f4\u8392\u63ac\u907d\u5c66\u741a\u67b8\u6910\u6998\u6989\u6a58\u728b\u98d3\u949c\u9514\u7aad\u88fe\u8d84\u91b5\u8e3d\u9f83\u96ce\u97ab","juan":"\u6350\u9e43\u5a1f\u5026\u7737\u5377\u7ee2\u9104\u72f7\u6d93\u684a\u8832\u9529\u954c\u96bd","jue":"\u6485\u652b\u6289\u6398\u5014\u7235\u89c9\u51b3\u8bc0\u7edd\u53a5\u5282\u8c32\u77cd\u8568\u5658\u5d1b\u7357\u5b53\u73cf\u6877\u6a5b\u721d\u9562\u8e76\u89d6","jun":"\u5747\u83cc\u94a7\u519b\u541b\u5cfb\u4fca\u7ae3\u6d5a\u90e1\u9a8f\u6343\u72fb\u76b2\u7b60\u9e87","ka":"\u5580\u5496\u5361\u4f67\u5494\u80e9","ke":"\u54af\u5777\u82db\u67ef\u68f5\u78d5\u9897\u79d1\u58f3\u54b3\u53ef\u6e34\u514b\u523b\u5ba2\u8bfe\u5ca2\u606a\u6e98\u9a92\u7f02\u73c2\u8f72\u6c2a\u778c\u94b6\u75b4\u7aa0\u874c\u9ac1","kai":"\u5f00\u63e9\u6977\u51ef\u6168\u5240\u57b2\u8488\u5ffe\u607a\u94e0\u950e","kan":"\u520a\u582a\u52d8\u574e\u780d\u770b\u4f83\u51f5\u83b0\u83b6\u6221\u9f9b\u77b0","kang":"\u5eb7\u6177\u7ce0\u625b\u6297\u4ea2\u7095\u5751\u4f09\u95f6\u94aa","kao":"\u8003\u62f7\u70e4\u9760\u5c3b\u6832\u7292\u94d0","ken":"\u80af\u5543\u57a6\u6073\u57a0\u88c9\u9880","keng":"\u542d\u5fd0\u94ff","kong":"\u7a7a\u6050\u5b54\u63a7\u5025\u5d06\u7b9c","kou":"\u62a0\u53e3\u6263\u5bc7\u82a4\u853b\u53e9\u770d\u7b58","ku":"\u67af\u54ed\u7a9f\u82e6\u9177\u5e93\u88e4\u5233\u5800\u55be\u7ed4\u9ab7","kua":"\u5938\u57ae\u630e\u8de8\u80ef\u4f89","kuai":"\u5757\u7b77\u4fa9\u5feb\u84af\u90d0\u8489\u72ef\u810d","kuan":"\u5bbd\u6b3e\u9acb","kuang":"\u5321\u7b50\u72c2\u6846\u77ff\u7736\u65f7\u51b5\u8bd3\u8bf3\u909d\u5739\u593c\u54d0\u7ea9\u8d36","kui":"\u4e8f\u76d4\u5cbf\u7aa5\u8475\u594e\u9b41\u5080\u9988\u6127\u6e83\u9997\u532e\u5914\u9697\u63c6\u55b9\u559f\u609d\u6126\u9615\u9035\u668c\u777d\u8069\u8770\u7bd1\u81fe\u8dec","kun":"\u5764\u6606\u6346\u56f0\u6083\u9603\u7428\u951f\u918c\u9cb2\u9ae1","kuo":"\u62ec\u6269\u5ed3\u9614\u86de","la":"\u5783\u62c9\u5587\u8721\u814a\u8fa3\u5566\u524c\u647a\u908b\u65ef\u782c\u760c","lai":"\u83b1\u6765\u8d56\u5d03\u5f95\u6d9e\u6fd1\u8d49\u7750\u94fc\u765e\u7c41","lan":"\u84dd\u5a6a\u680f\u62e6\u7bee\u9611\u5170\u6f9c\u8c30\u63fd\u89c8\u61d2\u7f06\u70c2\u6ee5\u5549\u5c9a\u61d4\u6f24\u6984\u6593\u7f71\u9567\u8934","lang":"\u7405\u6994\u72fc\u5eca\u90ce\u6717\u6d6a\u83a8\u8497\u5577\u9606\u9512\u7a02\u8782","lao":"\u635e\u52b3\u7262\u8001\u4f6c\u59e5\u916a\u70d9\u6d9d\u5520\u5d02\u6833\u94d1\u94f9\u75e8\u91aa","le":"\u52d2\u4e50\u808b\u4ec2\u53fb\u561e\u6cd0\u9cd3","lei":"\u96f7\u956d\u857e\u78ca\u7d2f\u5121\u5792\u64c2\u7c7b\u6cea\u7fb8\u8bd4\u837d\u54a7\u6f2f\u5ad8\u7f27\u6a91\u8012\u9179","ling":"\u68f1\u51b7\u62ce\u73b2\u83f1\u96f6\u9f84\u94c3\u4f36\u7f9a\u51cc\u7075\u9675\u5cad\u9886\u53e6\u4ee4\u9143\u5844\u82d3\u5464\u56f9\u6ce0\u7eeb\u67c3\u68c2\u74f4\u8046\u86c9\u7fce\u9cae","leng":"\u695e\u6123","li":"\u5398\u68a8\u7281\u9ece\u7bf1\u72f8\u79bb\u6f13\u7406\u674e\u91cc\u9ca4\u793c\u8389\u8354\u540f\u6817\u4e3d\u5389\u52b1\u783e\u5386\u5229\u5088\u4f8b\u4fd0\u75e2\u7acb\u7c92\u6ca5\u96b6\u529b\u7483\u54e9\u4fea\u4fda\u90e6\u575c\u82c8\u8385\u84e0\u85dc\u6369\u5456\u5533\u55b1\u7301\u6ea7\u6fa7\u9026\u5a0c\u5ae0\u9a8a\u7f21\u73de\u67a5\u680e\u8f79\u623e\u783a\u8a48\u7f79\u9502\u9e42\u75a0\u75ac\u86ce\u870a\u8821\u7b20\u7be5\u7c9d\u91b4\u8dde\u96f3\u9ca1\u9ce2\u9ee7","lian":"\u4fe9\u8054\u83b2\u8fde\u9570\u5ec9\u601c\u6d9f\u5e18\u655b\u8138\u94fe\u604b\u70bc\u7ec3\u631b\u8539\u5941\u6f4b\u6fc2\u5a08\u740f\u695d\u6b93\u81c1\u81a6\u88e2\u880a\u9ca2","liang":"\u7cae\u51c9\u6881\u7cb1\u826f\u4e24\u8f86\u91cf\u667e\u4eae\u8c05\u589a\u690b\u8e09\u9753\u9b49","liao":"\u64a9\u804a\u50da\u7597\u71ce\u5be5\u8fbd\u6f66\u4e86\u6482\u9563\u5ed6\u6599\u84fc\u5c25\u5639\u7360\u5bee\u7f2d\u948c\u9e69\u8022","lie":"\u5217\u88c2\u70c8\u52a3\u730e\u51bd\u57d2\u6d0c\u8d94\u8e90\u9b23","lin":"\u7433\u6797\u78f7\u9716\u4e34\u90bb\u9cde\u6dcb\u51db\u8d41\u541d\u853a\u5d99\u5eea\u9074\u6aa9\u8f9a\u77b5\u7cbc\u8e8f\u9e9f","liu":"\u6e9c\u7409\u69b4\u786b\u998f\u7559\u5218\u7624\u6d41\u67f3\u516d\u62a1\u507b\u848c\u6cd6\u6d4f\u905b\u9a9d\u7efa\u65d2\u7198\u950d\u954f\u9e68\u938f","long":"\u9f99\u804b\u5499\u7b3c\u7abf\u9686\u5784\u62e2\u9647\u5f04\u5785\u830f\u6cf7\u73d1\u680a\u80e7\u783b\u7643","lou":"\u697c\u5a04\u6402\u7bd3\u6f0f\u964b\u55bd\u5d5d\u9542\u7618\u8027\u877c\u9ac5","lu":"\u82a6\u5362\u9885\u5e90\u7089\u63b3\u5364\u864f\u9c81\u9e93\u788c\u9732\u8def\u8d42\u9e7f\u6f5e\u7984\u5f55\u9646\u622e\u5786\u6445\u64b8\u565c\u6cf8\u6e0c\u6f09\u7490\u680c\u6a79\u8f73\u8f82\u8f98\u6c07\u80ea\u9565\u9e2c\u9e6d\u7c0f\u823b\u9c88","lv":"\u9a74\u5415\u94dd\u4fa3\u65c5\u5c65\u5c61\u7f15\u8651\u6c2f\u5f8b\u7387\u6ee4\u7eff\u634b\u95fe\u6988\u8182\u7a06\u891b","luan":"\u5ce6\u5b6a\u6ee6\u5375\u4e71\u683e\u9e3e\u92ae","lue":"\u63a0\u7565\u950a","lun":"\u8f6e\u4f26\u4ed1\u6ca6\u7eb6\u8bba\u56f5","luo":"\u841d\u87ba\u7f57\u903b\u9523\u7ba9\u9aa1\u88f8\u843d\u6d1b\u9a86\u7edc\u502e\u8366\u645e\u7321\u6cfa\u6924\u8136\u9559\u7630\u96d2","ma":"\u5988\u9ebb\u739b\u7801\u8682\u9a6c\u9a82\u561b\u5417\u551b\u72b8\u5b37\u6769\u9ebd","mai":"\u57cb\u4e70\u9ea6\u5356\u8fc8\u8109\u52a2\u836c\u54aa\u973e","man":"\u7792\u9992\u86ee\u6ee1\u8513\u66fc\u6162\u6f2b\u8c29\u5881\u5e54\u7f26\u71b3\u9558\u989f\u87a8\u9cd7\u9794","mang":"\u8292\u832b\u76f2\u5fd9\u83bd\u9099\u6f2d\u6726\u786d\u87d2","meng":"\u6c13\u840c\u8499\u6aac\u76df\u9530\u731b\u68a6\u5b5f\u52d0\u750d\u77a2\u61f5\u791e\u867b\u8722\u8813\u824b\u8268\u9efe","miao":"\u732b\u82d7\u63cf\u7784\u85d0\u79d2\u6e3a\u5e99\u5999\u55b5\u9088\u7f08\u7f2a\u676a\u6dfc\u7707\u9e4b\u8731","mao":"\u8305\u951a\u6bdb\u77db\u94c6\u536f\u8302\u5192\u5e3d\u8c8c\u8d38\u4f94\u88a4\u52d6\u8306\u5cc1\u7441\u6634\u7266\u8004\u65c4\u61cb\u7780\u86d1\u8765\u87ca\u9ae6","me":"\u4e48","mei":"\u73ab\u679a\u6885\u9176\u9709\u7164\u6ca1\u7709\u5a92\u9541\u6bcf\u7f8e\u6627\u5bd0\u59b9\u5a9a\u5776\u8393\u5d4b\u7338\u6d7c\u6e44\u6963\u9545\u9e5b\u8882\u9b45","men":"\u95e8\u95f7\u4eec\u626a\u739f\u7116\u61d1\u9494","mi":"\u772f\u919a\u9761\u7cdc\u8ff7\u8c1c\u5f25\u7c73\u79d8\u89c5\u6ccc\u871c\u5bc6\u5e42\u8288\u5196\u8c27\u863c\u5627\u7315\u736f\u6c68\u5b93\u5f2d\u8112\u6549\u7cf8\u7e3b\u9e8b","mian":"\u68c9\u7720\u7ef5\u5195\u514d\u52c9\u5a29\u7f05\u9762\u6c94\u6e4e\u817c\u7704","mie":"\u8511\u706d\u54a9\u881b\u7bfe","min":"\u6c11\u62bf\u76bf\u654f\u60af\u95fd\u82e0\u5cb7\u95f5\u6cef\u73c9","ming":"\u660e\u879f\u9e23\u94ed\u540d\u547d\u51a5\u8317\u6e9f\u669d\u7791\u9169","miu":"\u8c2c","mo":"\u6478\u6479\u8611\u6a21\u819c\u78e8\u6469\u9b54\u62b9\u672b\u83ab\u58a8\u9ed8\u6cab\u6f20\u5bde\u964c\u8c1f\u8309\u84e6\u998d\u5aeb\u9546\u79e3\u763c\u8031\u87c6\u8c8a\u8c98","mou":"\u8c0b\u725f\u67d0\u53b6\u54de\u5a7a\u7738\u936a","mu":"\u62c7\u7261\u4ea9\u59c6\u6bcd\u5893\u66ae\u5e55\u52df\u6155\u6728\u76ee\u7766\u7267\u7a46\u4eeb\u82dc\u5452\u6c90\u6bea\u94bc","na":"\u62ff\u54ea\u5450\u94a0\u90a3\u5a1c\u7eb3\u5185\u637a\u80ad\u954e\u8872\u7bac","nai":"\u6c16\u4e43\u5976\u8010\u5948\u9f10\u827f\u8418\u67f0","nan":"\u5357\u7537\u96be\u56ca\u5583\u56e1\u6960\u8169\u877b\u8d67","nao":"\u6320\u8111\u607c\u95f9\u5b6c\u57b4\u7331\u7459\u7847\u94d9\u86f2","ne":"\u6dd6\u5462\u8bb7","nei":"\u9981","nen":"\u5ae9\u80fd\u6798\u6041","ni":"\u59ae\u9713\u502a\u6ce5\u5c3c\u62df\u4f60\u533f\u817b\u9006\u6eba\u4f32\u576d\u730a\u6029\u6ee0\u6635\u65ce\u7962\u615d\u7768\u94cc\u9cb5","nian":"\u852b\u62c8\u5e74\u78be\u64b5\u637b\u5ff5\u5eff\u8f87\u9ecf\u9c87\u9cb6","niang":"\u5a18\u917f","niao":"\u9e1f\u5c3f\u8311\u5b32\u8132\u8885","nie":"\u634f\u8042\u5b7d\u556e\u954a\u954d\u6d85\u4e5c\u9667\u8616\u55eb\u8080\u989e\u81ec\u8e51","nin":"\u60a8\u67e0","ning":"\u72de\u51dd\u5b81\u62e7\u6cde\u4f5e\u84e5\u549b\u752f\u804d","niu":"\u725b\u626d\u94ae\u7ebd\u72c3\u5ff8\u599e\u86b4","nong":"\u8113\u6d53\u519c\u4fac","nu":"\u5974\u52aa\u6012\u5476\u5e11\u5f29\u80ec\u5b65\u9a7d","nv":"\u5973\u6067\u9495\u8844","nuan":"\u6696","nuenue":"\u8650","nue":"\u759f\u8c11","nuo":"\u632a\u61e6\u7cef\u8bfa\u50a9\u6426\u558f\u9518","ou":"\u54e6\u6b27\u9e25\u6bb4\u85d5\u5455\u5076\u6ca4\u6004\u74ef\u8026","pa":"\u556a\u8db4\u722c\u5e15\u6015\u7436\u8469\u7b62","pai":"\u62cd\u6392\u724c\u5f98\u6e43\u6d3e\u4ff3\u848e","pan":"\u6500\u6f58\u76d8\u78d0\u76fc\u7554\u5224\u53db\u723f\u6cee\u88a2\u897b\u87e0\u8e52","pang":"\u4e53\u5e9e\u65c1\u802a\u80d6\u6ec2\u9004","pao":"\u629b\u5486\u5228\u70ae\u888d\u8dd1\u6ce1\u530f\u72cd\u5e96\u812c\u75b1","pei":"\u5478\u80da\u57f9\u88f4\u8d54\u966a\u914d\u4f69\u6c9b\u638a\u8f94\u5e14\u6de0\u65c6\u952b\u9185\u9708","pen":"\u55b7\u76c6\u6e53","peng":"\u7830\u62a8\u70f9\u6f8e\u5f6d\u84ec\u68da\u787c\u7bf7\u81a8\u670b\u9e4f\u6367\u78b0\u576f\u580b\u562d\u6026\u87db","pi":"\u7812\u9739\u6279\u62ab\u5288\u7435\u6bd7\u5564\u813e\u75b2\u76ae\u5339\u75de\u50fb\u5c41\u8b6c\u4e15\u9674\u90b3\u90eb\u572e\u9f19\u64d7\u567c\u5e80\u5ab2\u7eb0\u6787\u7513\u7765\u7f74\u94cd\u75e6\u7656\u758b\u868d\u8c94","pian":"\u7bc7\u504f\u7247\u9a97\u8c1d\u9a88\u728f\u80fc\u890a\u7fe9\u8e41","piao":"\u98d8\u6f02\u74e2\u7968\u527d\u560c\u5ad6\u7f25\u6b8d\u779f\u87b5","pie":"\u6487\u77a5\u4e3f\u82e4\u6c15","pin":"\u62fc\u9891\u8d2b\u54c1\u8058\u62da\u59d8\u5ad4\u6980\u725d\u98a6","ping":"\u4e52\u576a\u82f9\u840d\u5e73\u51ed\u74f6\u8bc4\u5c4f\u4fdc\u5a09\u67b0\u9c86","po":"\u5761\u6cfc\u9887\u5a46\u7834\u9b44\u8feb\u7c95\u53f5\u9131\u6ea5\u73c0\u948b\u94b7\u76a4\u7b38","pou":"\u5256\u88d2\u8e23","pu":"\u6251\u94fa\u4ec6\u8386\u8461\u83e9\u84b2\u57d4\u6734\u5703\u666e\u6d66\u8c31\u66dd\u7011\u530d\u5657\u6fee\u749e\u6c06\u9564\u9568\u8e7c","qi":"\u671f\u6b3a\u6816\u621a\u59bb\u4e03\u51c4\u6f06\u67d2\u6c8f\u5176\u68cb\u5947\u6b67\u7566\u5d0e\u8110\u9f50\u65d7\u7948\u7941\u9a91\u8d77\u5c82\u4e5e\u4f01\u542f\u5951\u780c\u5668\u6c14\u8fc4\u5f03\u6c7d\u6ce3\u8bab\u4e9f\u4e93\u573b\u8291\u840b\u847a\u5601\u5c7a\u5c90\u6c54\u6dc7\u9a90\u7eee\u742a\u7426\u675e\u6864\u69ed\u6b39\u797a\u61a9\u789b\u86f4\u871e\u7da6\u7dae\u8dbf\u8e4a\u9ccd\u9e92","qia":"\u6390\u6070\u6d3d\u845c","qian":"\u7275\u6266\u948e\u94c5\u5343\u8fc1\u7b7e\u4edf\u8c26\u4e7e\u9ed4\u94b1\u94b3\u524d\u6f5c\u9063\u6d45\u8c34\u5811\u5d4c\u6b20\u6b49\u4f65\u9621\u828a\u82a1\u8368\u63ae\u5c8d\u60ad\u614a\u9a9e\u6434\u8930\u7f31\u6920\u80b7\u6106\u94a4\u8654\u7b9d","qiang":"\u67aa\u545b\u8154\u7f8c\u5899\u8537\u5f3a\u62a2\u5af1\u6a2f\u6217\u709d\u9516\u9535\u956a\u8941\u8723\u7f9f\u8deb\u8dc4","qiao":"\u6a47\u9539\u6572\u6084\u6865\u77a7\u4e54\u4fa8\u5de7\u9798\u64ac\u7fd8\u5ced\u4fcf\u7a8d\u5281\u8bee\u8c2f\u835e\u6100\u6194\u7f32\u6a35\u6bf3\u7857\u8df7\u9792","qie":"\u5207\u8304\u4e14\u602f\u7a83\u90c4\u553c\u60ec\u59be\u6308\u9532\u7ba7","qin":"\u94a6\u4fb5\u4eb2\u79e6\u7434\u52e4\u82b9\u64d2\u79bd\u5bdd\u6c81\u82a9\u84c1\u8572\u63ff\u5423\u55ea\u5659\u6eb1\u6a8e\u8793\u887e","qing":"\u9752\u8f7b\u6c22\u503e\u537f\u6e05\u64ce\u6674\u6c30\u60c5\u9877\u8bf7\u5e86\u5029\u82d8\u570a\u6aa0\u78ec\u873b\u7f44\u7b90\u8b26\u9cad\u9ee5","qiong":"\u743c\u7a77\u909b\u8315\u7a79\u7b47\u928e","qiu":"\u79cb\u4e18\u90b1\u7403\u6c42\u56da\u914b\u6cc5\u4fc5\u6c3d\u5def\u827d\u72b0\u6e6b\u9011\u9052\u6978\u8d47\u9e20\u866c\u86af\u8764\u88d8\u7cd7\u9cc5\u9f3d","qu":"\u8d8b\u533a\u86c6\u66f2\u8eaf\u5c48\u9a71\u6e20\u53d6\u5a36\u9f8b\u8da3\u53bb\u8bce\u52ac\u8556\u8627\u5c96\u8862\u9612\u74a9\u89d1\u6c0d\u795b\u78f2\u766f\u86d0\u883c\u9eb4\u77bf\u9ee2","quan":"\u5708\u98a7\u6743\u919b\u6cc9\u5168\u75ca\u62f3\u72ac\u5238\u529d\u8be0\u8343\u737e\u609b\u7efb\u8f81\u754e\u94e8\u8737\u7b4c\u9b08","que":"\u7f3a\u7094\u7638\u5374\u9e4a\u69b7\u786e\u96c0\u9619\u60ab","qun":"\u88d9\u7fa4\u9021","ran":"\u7136\u71c3\u5189\u67d3\u82d2\u9aef","rang":"\u74e4\u58e4\u6518\u56b7\u8ba9\u79b3\u7a70","rao":"\u9976\u6270\u7ed5\u835b\u5a06\u6861","ruo":"\u60f9\u82e5\u5f31","re":"\u70ed\u504c","ren":"\u58ec\u4ec1\u4eba\u5fcd\u97e7\u4efb\u8ba4\u5203\u598a\u7eab\u4ede\u834f\u845a\u996a\u8f6b\u7a14\u887d","reng":"\u6254\u4ecd","ri":"\u65e5","rong":"\u620e\u8338\u84c9\u8363\u878d\u7194\u6eb6\u5bb9\u7ed2\u5197\u5d58\u72e8\u7f1b\u6995\u877e","rou":"\u63c9\u67d4\u8089\u7cc5\u8e42\u97a3","ru":"\u8339\u8815\u5112\u5b7a\u5982\u8fb1\u4e73\u6c5d\u5165\u8925\u84d0\u85b7\u5685\u6d33\u6ebd\u6fe1\u94f7\u8966\u98a5","ruan":"\u8f6f\u962e\u670a","rui":"\u854a\u745e\u9510\u82ae\u8564\u777f\u868b","run":"\u95f0\u6da6","sa":"\u6492\u6d12\u8428\u5345\u4ee8\u6332\u98d2","sai":"\u816e\u9cc3\u585e\u8d5b\u567b","san":"\u4e09\u53c1\u4f1e\u6563\u5f61\u9993\u6c35\u6bf5\u7cc1\u9730","sang":"\u6851\u55d3\u4e27\u6421\u78c9\u98a1","sao":"\u6414\u9a9a\u626b\u5ac2\u57fd\u81ca\u7619\u9ccb","se":"\u745f\u8272\u6da9\u556c\u94e9\u94ef\u7a51","sen":"\u68ee","seng":"\u50e7","sha":"\u838e\u7802\u6740\u5239\u6c99\u7eb1\u50bb\u5565\u715e\u810e\u6b43\u75e7\u88df\u970e\u9ca8","shai":"\u7b5b\u6652\u917e","shan":"\u73ca\u82eb\u6749\u5c71\u5220\u717d\u886b\u95ea\u9655\u64c5\u8d61\u81b3\u5584\u6c55\u6247\u7f2e\u5261\u8baa\u912f\u57cf\u829f\u6f78\u59d7\u9a9f\u81bb\u9490\u759d\u87ee\u8222\u8dda\u9cdd","shang":"\u5892\u4f24\u5546\u8d4f\u664c\u4e0a\u5c1a\u88f3\u57a7\u7ef1\u6b87\u71b5\u89de","shao":"\u68a2\u634e\u7a0d\u70e7\u828d\u52fa\u97f6\u5c11\u54e8\u90b5\u7ecd\u52ad\u82d5\u6f72\u86f8\u7b24\u7b72\u8244","she":"\u5962\u8d4a\u86c7\u820c\u820d\u8d66\u6444\u5c04\u6151\u6d89\u793e\u8bbe\u538d\u4f58\u731e\u7572\u9e9d","shen":"\u7837\u7533\u547b\u4f38\u8eab\u6df1\u5a20\u7ec5\u795e\u6c88\u5ba1\u5a76\u751a\u80be\u614e\u6e17\u8bdc\u8c02\u5432\u54c2\u6e16\u6939\u77e7\u8703","sheng":"\u58f0\u751f\u7525\u7272\u5347\u7ef3\u7701\u76db\u5269\u80dc\u5723\u4e1e\u6e11\u5ab5\u771a\u7b19","shi":"\u5e08\u5931\u72ee\u65bd\u6e7f\u8bd7\u5c38\u8671\u5341\u77f3\u62fe\u65f6\u4ec0\u98df\u8680\u5b9e\u8bc6\u53f2\u77e2\u4f7f\u5c4e\u9a76\u59cb\u5f0f\u793a\u58eb\u4e16\u67ff\u4e8b\u62ed\u8a93\u901d\u52bf\u662f\u55dc\u566c\u9002\u4ed5\u4f8d\u91ca\u9970\u6c0f\u5e02\u6043\u5ba4\u89c6\u8bd5\u8c25\u57d8\u83b3\u84cd\u5f11\u5511\u9963\u8f7c\u8006\u8d33\u70bb\u793b\u94c8\u94ca\u87ab\u8210\u7b6e\u8c55\u9ca5\u9cba","shou":"\u6536\u624b\u9996\u5b88\u5bff\u6388\u552e\u53d7\u7626\u517d\u624c\u72e9\u7ef6\u824f","shu":"\u852c\u67a2\u68b3\u6b8a\u6292\u8f93\u53d4\u8212\u6dd1\u758f\u4e66\u8d4e\u5b70\u719f\u85af\u6691\u66d9\u7f72\u8700\u9ecd\u9f20\u5c5e\u672f\u8ff0\u6811\u675f\u620d\u7ad6\u5885\u5eb6\u6570\u6f31\u6055\u500f\u587e\u83fd\u5fc4\u6cad\u6d91\u6f8d\u59dd\u7ebe\u6bf9\u8167\u6bb3\u956f\u79eb\u9e6c","shua":"\u5237\u800d\u5530\u6dae","shuai":"\u6454\u8870\u7529\u5e05\u87c0","shuan":"\u6813\u62f4\u95e9","shuang":"\u971c\u53cc\u723d\u5b40","shui":"\u8c01\u6c34\u7761\u7a0e","shun":"\u542e\u77ac\u987a\u821c\u6042","shuo":"\u8bf4\u7855\u6714\u70c1\u84b4\u6420\u55cd\u6fef\u5981\u69ca\u94c4","si":"\u65af\u6495\u5636\u601d\u79c1\u53f8\u4e1d\u6b7b\u8086\u5bfa\u55e3\u56db\u4f3a\u4f3c\u9972\u5df3\u53ae\u4fdf\u5155\u83e5\u549d\u6c5c\u6cd7\u6f8c\u59d2\u9a77\u7f0c\u7940\u7960\u9536\u9e36\u801c\u86f3\u7b25","song":"\u677e\u8038\u6002\u9882\u9001\u5b8b\u8bbc\u8bf5\u51c7\u83d8\u5d27\u5d69\u5fea\u609a\u6dde\u7ae6","sou":"\u641c\u8258\u64de\u55fd\u53df\u55d6\u55fe\u998a\u6eb2\u98d5\u778d\u953c\u878b","su":"\u82cf\u9165\u4fd7\u7d20\u901f\u7c9f\u50f3\u5851\u6eaf\u5bbf\u8bc9\u8083\u5919\u8c21\u850c\u55c9\u612b\u7c0c\u89eb\u7a23","suan":"\u9178\u849c\u7b97","sui":"\u867d\u968b\u968f\u7ee5\u9ad3\u788e\u5c81\u7a57\u9042\u96a7\u795f\u84d1\u51ab\u8c07\u6fc9\u9083\u71e7\u772d\u7762","sun":"\u5b59\u635f\u7b0b\u836a\u72f2\u98e7\u69ab\u8de3\u96bc","suo":"\u68ad\u5506\u7f29\u7410\u7d22\u9501\u6240\u5522\u55e6\u5a11\u686b\u7743\u7fa7","ta":"\u584c\u4ed6\u5b83\u5979\u5854\u736d\u631e\u8e4b\u8e0f\u95fc\u6ebb\u9062\u69bb\u6c93","tai":"\u80ce\u82d4\u62ac\u53f0\u6cf0\u915e\u592a\u6001\u6c70\u90b0\u85b9\u80bd\u70b1\u949b\u8dc6\u9c90","tan":"\u574d\u644a\u8d2a\u762b\u6ee9\u575b\u6a80\u75f0\u6f6d\u8c2d\u8c08\u5766\u6bef\u8892\u78b3\u63a2\u53f9\u70ad\u90ef\u8548\u6619\u94bd\u952c\u8983","tang":"\u6c64\u5858\u642a\u5802\u68e0\u819b\u5510\u7cd6\u50a5\u9967\u6e8f\u746d\u94f4\u9557\u8025\u8797\u87b3\u7fb0\u91a3","thang":"\u5018\u8eba\u6dcc","theng":"\u8d9f\u70eb","tao":"\u638f\u6d9b\u6ed4\u7ee6\u8404\u6843\u9003\u6dd8\u9676\u8ba8\u5957\u6311\u9f17\u5555\u97ec\u9955","te":"\u7279","teng":"\u85e4\u817e\u75bc\u8a8a\u6ed5","ti":"\u68af\u5254\u8e22\u9511\u63d0\u9898\u8e44\u557c\u4f53\u66ff\u568f\u60d5\u6d95\u5243\u5c49\u8351\u608c\u9016\u7ee8\u7f07\u9e48\u88fc\u918d","tian":"\u5929\u6dfb\u586b\u7530\u751c\u606c\u8214\u8146\u63ad\u5fdd\u9617\u6b84\u754b\u94bf\u86ba","tiao":"\u6761\u8fe2\u773a\u8df3\u4f7b\u7967\u94eb\u7a95\u9f86\u9ca6","tie":"\u8d34\u94c1\u5e16\u841c\u992e","ting":"\u5385\u542c\u70c3\u6c40\u5ef7\u505c\u4ead\u5ead\u633a\u8247\u839b\u8476\u5a77\u6883\u8713\u9706","tong":"\u901a\u6850\u916e\u77b3\u540c\u94dc\u5f64\u7ae5\u6876\u6345\u7b52\u7edf\u75db\u4f5f\u50ee\u4edd\u833c\u55f5\u6078\u6f7c\u783c","tou":"\u5077\u6295\u5934\u900f\u4ea0","tu":"\u51f8\u79c3\u7a81\u56fe\u5f92\u9014\u6d82\u5c60\u571f\u5410\u5154\u580d\u837c\u83df\u948d\u9174","tuan":"\u6e4d\u56e2\u7583","tui":"\u63a8\u9893\u817f\u8715\u892a\u9000\u5fd2\u717a","tun":"\u541e\u5c6f\u81c0\u9968\u66be\u8c5a\u7a80","tuo":"\u62d6\u6258\u8131\u9e35\u9640\u9a6e\u9a7c\u692d\u59a5\u62d3\u553e\u4e47\u4f57\u5768\u5eb9\u6cb1\u67dd\u7823\u7ba8\u8204\u8dce\u9f0d","wa":"\u6316\u54c7\u86d9\u6d3c\u5a03\u74e6\u889c\u4f64\u5a32\u817d","wai":"\u6b6a\u5916","wan":"\u8c4c\u5f2f\u6e7e\u73a9\u987d\u4e38\u70f7\u5b8c\u7897\u633d\u665a\u7696\u60cb\u5b9b\u5a49\u4e07\u8155\u525c\u8284\u82cb\u83c0\u7ea8\u7efe\u742c\u8118\u7579\u873f\u7ba2","wang":"\u6c6a\u738b\u4ea1\u6789\u7f51\u5f80\u65fa\u671b\u5fd8\u5984\u7f54\u5c22\u60d8\u8f8b\u9b4d","wei":"\u5a01\u5dcd\u5fae\u5371\u97e6\u8fdd\u6845\u56f4\u552f\u60df\u4e3a\u6f4d\u7ef4\u82c7\u840e\u59d4\u4f1f\u4f2a\u5c3e\u7eac\u672a\u851a\u5473\u754f\u80c3\u5582\u9b4f\u4f4d\u6e2d\u8c13\u5c09\u6170\u536b\u502d\u504e\u8bff\u9688\u8473\u8587\u5e0f\u5e37\u5d34\u5d6c\u7325\u732c\u95f1\u6ca9\u6d27\u6da0\u9036\u5a13\u73ae\u97ea\u8ece\u709c\u7168\u71a8\u75ff\u8249\u9c94","wen":"\u761f\u6e29\u868a\u6587\u95fb\u7eb9\u543b\u7a33\u7d0a\u95ee\u520e\u6120\u960c\u6c76\u74ba\u97eb\u6b81\u96ef","weng":"\u55e1\u7fc1\u74ee\u84ca\u8579","wo":"\u631d\u8717\u6da1\u7a9d\u6211\u65a1\u5367\u63e1\u6c83\u83b4\u5e44\u6e25\u674c\u809f\u9f8c","wu":"\u5deb\u545c\u94a8\u4e4c\u6c61\u8bec\u5c4b\u65e0\u829c\u68a7\u543e\u5434\u6bcb\u6b66\u4e94\u6342\u5348\u821e\u4f0d\u4fae\u575e\u620a\u96fe\u6664\u7269\u52ff\u52a1\u609f\u8bef\u5140\u4ef5\u9622\u90ac\u572c\u82b4\u5e91\u6003\u5fe4\u6d6f\u5be4\u8fd5\u59a9\u9a9b\u727e\u7110\u9e49\u9e5c\u8708\u92c8\u9f2f","xi":"\u6614\u7199\u6790\u897f\u7852\u77fd\u6670\u563b\u5438\u9521\u727a\u7a00\u606f\u5e0c\u6089\u819d\u5915\u60dc\u7184\u70ef\u6eaa\u6c50\u7280\u6a84\u88ad\u5e2d\u4e60\u5ab3\u559c\u94e3\u6d17\u7cfb\u9699\u620f\u7ec6\u50d6\u516e\u96b0\u90d7\u831c\u8478\u84f0\u595a\u550f\u5f99\u9969\u960b\u6d60\u6dc5\u5c63\u5b09\u73ba\u6a28\u66e6\u89cb\u6b37\u71b9\u798a\u79a7\u94b8\u7699\u7a78\u8725\u87cb\u823e\u7fb2\u7c9e\u7fd5\u91af\u9f37","xia":"\u778e\u867e\u5323\u971e\u8f96\u6687\u5ce1\u4fa0\u72ed\u4e0b\u53a6\u590f\u5413\u6380\u846d\u55c4\u72ce\u9050\u7455\u7856\u7615\u7f45\u9ee0","xian":"\u9528\u5148\u4ed9\u9c9c\u7ea4\u54b8\u8d24\u8854\u8237\u95f2\u6d8e\u5f26\u5acc\u663e\u9669\u73b0\u732e\u53bf\u817a\u9985\u7fa1\u5baa\u9677\u9650\u7ebf\u51bc\u85d3\u5c98\u7303\u66b9\u5a34\u6c19\u7946\u9e47\u75eb\u86ac\u7b45\u7c7c\u9170\u8df9","xiang":"\u76f8\u53a2\u9576\u9999\u7bb1\u8944\u6e58\u4e61\u7fd4\u7965\u8be6\u60f3\u54cd\u4eab\u9879\u5df7\u6a61\u50cf\u5411\u8c61\u8297\u8459\u9977\u5ea0\u9aa7\u7f03\u87d3\u9c9e\u98e8","xiao":"\u8427\u785d\u9704\u524a\u54ee\u56a3\u9500\u6d88\u5bb5\u6dc6\u6653\u5c0f\u5b5d\u6821\u8096\u5578\u7b11\u6548\u54d3\u54bb\u5d24\u6f47\u900d\u9a81\u7ee1\u67ad\u67b5\u7b71\u7bab\u9b48","xie":"\u6954\u4e9b\u6b47\u874e\u978b\u534f\u631f\u643a\u90aa\u659c\u80c1\u8c10\u5199\u68b0\u5378\u87f9\u61c8\u6cc4\u6cfb\u8c22\u5c51\u5055\u4eb5\u52f0\u71ee\u85a4\u64b7\u5ee8\u7023\u9082\u7ec1\u7f2c\u69ad\u698d\u6b59\u8e9e","xin":"\u85aa\u82af\u950c\u6b23\u8f9b\u65b0\u5ffb\u5fc3\u4fe1\u8845\u56df\u99a8\u8398\u6b46\u94fd\u946b","xing":"\u661f\u8165\u7329\u60fa\u5174\u5211\u578b\u5f62\u90a2\u884c\u9192\u5e78\u674f\u6027\u59d3\u9649\u8347\u8365\u64e4\u60bb\u784e","xiong":"\u5144\u51f6\u80f8\u5308\u6c79\u96c4\u718a\u828e","xiu":"\u4f11\u4fee\u7f9e\u673d\u55c5\u9508\u79c0\u8896\u7ee3\u83a0\u5cab\u9990\u5ea5\u9e3a\u8c85\u9af9","xu":"\u589f\u620c\u9700\u865a\u5618\u987b\u5f90\u8bb8\u84c4\u9157\u53d9\u65ed\u5e8f\u755c\u6064\u7d6e\u5a7f\u7eea\u7eed\u8bb4\u8be9\u5729\u84ff\u6035\u6d2b\u6e86\u987c\u6829\u7166\u7809\u76f1\u80e5\u7cc8\u9191","xuan":"\u8f69\u55a7\u5ba3\u60ac\u65cb\u7384\u9009\u7663\u7729\u7eda\u5107\u8c16\u8431\u63ce\u9994\u6ceb\u6d35\u6e32\u6f29\u7487\u6966\u6684\u70ab\u714a\u78b9\u94c9\u955f\u75c3","xue":"\u9774\u859b\u5b66\u7a74\u96ea\u8840\u5671\u6cf6\u9cd5","xun":"\u52cb\u718f\u5faa\u65ec\u8be2\u5bfb\u9a6f\u5de1\u6b89\u6c5b\u8bad\u8baf\u900a\u8fc5\u5dfd\u57d9\u8340\u85b0\u5ccb\u5f87\u6d54\u66db\u7aa8\u91ba\u9c9f","ya":"\u538b\u62bc\u9e26\u9e2d\u5440\u4e2b\u82bd\u7259\u869c\u5d16\u8859\u6daf\u96c5\u54d1\u4e9a\u8bb6\u4f22\u63e0\u5416\u5c88\u8fd3\u5a05\u740a\u6860\u6c29\u7811\u775a\u75d6","yan":"\u7109\u54bd\u9609\u70df\u6df9\u76d0\u4e25\u7814\u8712\u5ca9\u5ef6\u8a00\u989c\u960e\u708e\u6cbf\u5944\u63a9\u773c\u884d\u6f14\u8273\u5830\u71d5\u538c\u781a\u96c1\u5501\u5f66\u7130\u5bb4\u8c1a\u9a8c\u53a3\u9765\u8d5d\u4fe8\u5043\u5156\u8ba0\u8c33\u90fe\u9122\u82ab\u83f8\u5d26\u6079\u95eb\u960f\u6d07\u6e6e\u6edf\u598d\u5ae3\u7430\u664f\u80ed\u814c\u7131\u7f68\u7b75\u917d\u9b47\u990d\u9f39","yang":"\u6b83\u592e\u9e2f\u79e7\u6768\u626c\u4f6f\u75a1\u7f8a\u6d0b\u9633\u6c27\u4ef0\u75d2\u517b\u6837\u6f3e\u5f89\u600f\u6cf1\u7080\u70ca\u6059\u86d8\u9785","yao":"\u9080\u8170\u5996\u7476\u6447\u5c27\u9065\u7a91\u8c23\u59da\u54ac\u8200\u836f\u8981\u8000\u592d\u723b\u5406\u5d3e\u5fad\u7039\u5e7a\u73e7\u6773\u66dc\u80b4\u9e5e\u7a88\u7e47\u9cd0","ye":"\u6930\u564e\u8036\u7237\u91ce\u51b6\u4e5f\u9875\u6396\u4e1a\u53f6\u66f3\u814b\u591c\u6db2\u8c12\u90ba\u63f6\u9980\u6654\u70e8\u94d8","yi":"\u4e00\u58f9\u533b\u63d6\u94f1\u4f9d\u4f0a\u8863\u9890\u5937\u9057\u79fb\u4eea\u80f0\u7591\u6c82\u5b9c\u59e8\u5f5d\u6905\u8681\u501a\u5df2\u4e59\u77e3\u4ee5\u827a\u6291\u6613\u9091\u5c79\u4ebf\u5f79\u81c6\u9038\u8084\u75ab\u4ea6\u88d4\u610f\u6bc5\u5fc6\u4e49\u76ca\u6ea2\u8be3\u8bae\u8c0a\u8bd1\u5f02\u7ffc\u7fcc\u7ece\u5208\u5293\u4f7e\u8bd2\u572a\u572f\u57f8\u61ff\u82e1\u858f\u5f08\u5955\u6339\u5f0b\u5453\u54a6\u54bf\u566b\u5cc4\u5db7\u7317\u9974\u603f\u6021\u6092\u6f2a\u8fe4\u9a7f\u7f22\u6baa\u8d3b\u65d6\u71a0\u9487\u9552\u9571\u75cd\u7617\u7654\u7fca\u8864\u8734\u8223\u7fbf\u7ff3\u914f\u9edf","yin":"\u8335\u836b\u56e0\u6bb7\u97f3\u9634\u59fb\u541f\u94f6\u6deb\u5bc5\u996e\u5c39\u5f15\u9690\u5370\u80e4\u911e\u5819\u831a\u5591\u72fa\u5924\u6c24\u94df\u763e\u8693\u972a\u9f88","ying":"\u82f1\u6a31\u5a74\u9e70\u5e94\u7f28\u83b9\u8424\u8425\u8367\u8747\u8fce\u8d62\u76c8\u5f71\u9896\u786c\u6620\u5b34\u90e2\u8314\u83ba\u8426\u6484\u5624\u81ba\u6ee2\u6f46\u701b\u745b\u748e\u6979\u9e66\u763f\u988d\u7f42","yo":"\u54df\u5537","yong":"\u62e5\u4f63\u81c3\u75c8\u5eb8\u96cd\u8e0a\u86f9\u548f\u6cf3\u6d8c\u6c38\u607f\u52c7\u7528\u4fd1\u58c5\u5889\u6175\u9095\u955b\u752c\u9cd9\u9954","you":"\u5e7d\u4f18\u60a0\u5fe7\u5c24\u7531\u90ae\u94c0\u72b9\u6cb9\u6e38\u9149\u6709\u53cb\u53f3\u4f51\u91c9\u8bf1\u53c8\u5e7c\u5363\u6538\u4f91\u83b8\u5466\u56ff\u5ba5\u67da\u7337\u7256\u94d5\u75a3\u8763\u9c7f\u9edd\u9f2c","yu":"\u8fc2\u6de4\u4e8e\u76c2\u6986\u865e\u611a\u8206\u4f59\u4fde\u903e\u9c7c\u6109\u6e1d\u6e14\u9685\u4e88\u5a31\u96e8\u4e0e\u5c7f\u79b9\u5b87\u8bed\u7fbd\u7389\u57df\u828b\u90c1\u5401\u9047\u55bb\u5cea\u5fa1\u6108\u6b32\u72f1\u80b2\u8a89\u6d74\u5bd3\u88d5\u9884\u8c6b\u9a6d\u79ba\u6bd3\u4f1b\u4fe3\u8c00\u8c15\u8438\u84e3\u63c4\u5581\u5704\u5709\u5d5b\u72f3\u996b\u5ebe\u9608\u59aa\u59a4\u7ea1\u745c\u6631\u89ce\u8174\u6b24\u65bc\u715c\u71e0\u807f\u94b0\u9e46\u7610\u7600\u7ab3\u8753\u7afd\u8201\u96e9\u9f89","yuan":"\u9e33\u6e0a\u51a4\u5143\u57a3\u8881\u539f\u63f4\u8f95\u56ed\u5458\u5706\u733f\u6e90\u7f18\u8fdc\u82d1\u613f\u6028\u9662\u586c\u6c85\u5a9b\u7457\u6a7c\u7230\u7722\u9e22\u8788\u9f0b","yue":"\u66f0\u7ea6\u8d8a\u8dc3\u94a5\u5cb3\u7ca4\u6708\u60a6\u9605\u9fa0\u6a3e\u5216\u94ba","yun":"\u8018\u4e91\u90e7\u5300\u9668\u5141\u8fd0\u8574\u915d\u6655\u97f5\u5b55\u90d3\u82b8\u72c1\u607d\u7ead\u6b92\u6600\u6c32","za":"\u531d\u7838\u6742\u62f6\u5482","zai":"\u683d\u54c9\u707e\u5bb0\u8f7d\u518d\u5728\u54b1\u5d3d\u753e","zan":"\u6512\u6682\u8d5e\u74d2\u661d\u7c2a\u7ccc\u8db1\u933e","zang":"\u8d43\u810f\u846c\u5958\u6215\u81e7","zao":"\u906d\u7cdf\u51ff\u85fb\u67a3\u65e9\u6fa1\u86a4\u8e81\u566a\u9020\u7682\u7076\u71e5\u5523\u7f2b","ze":"\u8d23\u62e9\u5219\u6cfd\u4ec4\u8d5c\u5567\u8fee\u6603\u7b2e\u7ba6\u8234","zei":"\u8d3c","zen":"\u600e\u8c2e","zeng":"\u589e\u618e\u66fe\u8d60\u7f2f\u7511\u7f7e\u9503","zha":"\u624e\u55b3\u6e23\u672d\u8f67\u94e1\u95f8\u7728\u6805\u69a8\u548b\u4e4d\u70b8\u8bc8\u63f8\u5412\u54a4\u54f3\u600d\u781f\u75c4\u86b1\u9f44","zhai":"\u6458\u658b\u5b85\u7a84\u503a\u5be8\u7826","zhan":"\u77bb\u6be1\u8a79\u7c98\u6cbe\u76cf\u65a9\u8f97\u5d2d\u5c55\u8638\u6808\u5360\u6218\u7ad9\u6e5b\u7efd\u8c35\u640c\u65c3","zhang":"\u6a1f\u7ae0\u5f70\u6f33\u5f20\u638c\u6da8\u6756\u4e08\u5e10\u8d26\u4ed7\u80c0\u7634\u969c\u4ec9\u9123\u5e5b\u5d82\u7350\u5adc\u748b\u87d1","zhao":"\u62db\u662d\u627e\u6cbc\u8d75\u7167\u7f69\u5146\u8087\u53ec\u722a\u8bcf\u68f9\u948a\u7b0a","zhe":"\u906e\u6298\u54f2\u86f0\u8f99\u8005\u9517\u8517\u8fd9\u6d59\u8c2a\u966c\u67d8\u8f84\u78d4\u9e67\u891a\u8707\u8d6d","zhen":"\u73cd\u659f\u771f\u7504\u7827\u81fb\u8d1e\u9488\u4fa6\u6795\u75b9\u8bca\u9707\u632f\u9547\u9635\u7f1c\u6862\u699b\u8f78\u8d48\u80d7\u6715\u796f\u755b\u9e29","zheng":"\u84b8\u6323\u7741\u5f81\u72f0\u4e89\u6014\u6574\u62ef\u6b63\u653f\u5e27\u75c7\u90d1\u8bc1\u8be4\u5ce5\u94b2\u94ee\u7b5d","zhi":"\u829d\u679d\u652f\u5431\u8718\u77e5\u80a2\u8102\u6c41\u4e4b\u7ec7\u804c\u76f4\u690d\u6b96\u6267\u503c\u4f84\u5740\u6307\u6b62\u8dbe\u53ea\u65e8\u7eb8\u5fd7\u631a\u63b7\u81f3\u81f4\u7f6e\u5e1c\u5cd9\u5236\u667a\u79e9\u7a1a\u8d28\u7099\u75d4\u6ede\u6cbb\u7a92\u536e\u965f\u90c5\u57f4\u82b7\u646d\u5e19\u5fee\u5f58\u54ab\u9a98\u6809\u67b3\u6800\u684e\u8f75\u8f7e\u6534\u8d3d\u81a3\u7949\u7957\u9ef9\u96c9\u9e37\u75e3\u86ed\u7d77\u916f\u8dd6\u8e2c\u8e2f\u8c78\u89ef","zhong":"\u4e2d\u76c5\u5fe0\u949f\u8877\u7ec8\u79cd\u80bf\u91cd\u4ef2\u4f17\u51a2\u953a\u87bd\u8202\u822f\u8e35","zhou":"\u821f\u5468\u5dde\u6d32\u8bcc\u7ca5\u8f74\u8098\u5e1a\u5492\u76b1\u5b99\u663c\u9aa4\u5544\u7740\u501c\u8bf9\u836e\u9b3b\u7ea3\u80c4\u78a1\u7c40\u8233\u914e\u9cb7","zhu":"\u73e0\u682a\u86db\u6731\u732a\u8bf8\u8bdb\u9010\u7af9\u70db\u716e\u62c4\u77a9\u5631\u4e3b\u8457\u67f1\u52a9\u86c0\u8d2e\u94f8\u7b51\u4f4f\u6ce8\u795d\u9a7b\u4f2b\u4f8f\u90be\u82ce\u8331\u6d19\u6e1a\u6f74\u9a7a\u677c\u69e0\u6a65\u70b7\u94e2\u75b0\u7603\u86b0\u7afa\u7bb8\u7fe5\u8e85\u9e88","zhua":"\u6293","zhuai":"\u62fd","zhuan":"\u4e13\u7816\u8f6c\u64b0\u8d5a\u7bc6\u629f\u556d\u989b","zhuang":"\u6869\u5e84\u88c5\u5986\u649e\u58ee\u72b6\u4e2c","zhui":"\u690e\u9525\u8ffd\u8d58\u5760\u7f00\u8411\u9a93\u7f12","zhun":"\u8c06\u51c6","zhuo":"\u6349\u62d9\u5353\u684c\u7422\u8301\u914c\u707c\u6d4a\u502c\u8bfc\u5ef4\u855e\u64e2\u555c\u6d5e\u6dbf\u6753\u712f\u799a\u65ab","zi":"\u5179\u54a8\u8d44\u59ff\u6ecb\u6dc4\u5b5c\u7d2b\u4ed4\u7c7d\u6ed3\u5b50\u81ea\u6e0d\u5b57\u8c18\u5d6b\u59ca\u5b73\u7f01\u6893\u8f8e\u8d40\u6063\u7726\u9531\u79ed\u8014\u7b2b\u7ca2\u89dc\u8a3e\u9cbb\u9aed","zong":"\u9b03\u68d5\u8e2a\u5b97\u7efc\u603b\u7eb5\u8159\u7cbd","zou":"\u90b9\u8d70\u594f\u63cd\u9139\u9cb0","zu":"\u79df\u8db3\u5352\u65cf\u7956\u8bc5\u963b\u7ec4\u4fce\u83f9\u5550\u5f82\u9a75\u8e74","zuan":"\u94bb\u7e82\u6525\u7f35","zui":"\u5634\u9189\u6700\u7f6a","zun":"\u5c0a\u9075\u6499\u6a3d\u9cdf","zuo":"\u6628\u5de6\u4f50\u67de\u505a\u4f5c\u5750\u5ea7\u961d\u963c\u80d9\u795a\u9162","cou":"\u85ae\u6971\u8f8f\u8160","nang":"\u652e\u54dd\u56d4\u9995\u66e9","o":"\u5594","dia":"\u55f2","chuai":"\u562c\u81aa\u8e39","cen":"\u5c91\u6d94","diu":"\u94e5","nou":"\u8028","fou":"\u7f36","bia":"\u9adf"}, 44 }, 45 46 47 48 /** 49 * @author Rui.Zhang 50 * @class 数据校验类 51 * @description 提供一些数据校验函数 52 */ 53 validation : { 54 55 56 57 /** 58 * @author Rui.Zhang 59 * @description 通过正则判断数据是否为小数 60 * @param {String} str_data 待校验的数据 61 * @returns {Boolean}, true:是小数 62 **/ 63 isDecimal : function (str_data) { 64 str_data = str_data || String(this); 65 66 var reg = /^[0-9]+\.[0-9]+$/; 67 return reg.test(str_data); 68 }, 69 70 71 /** 72 * @author Rui.Zhang 73 * @description 通过正则来判断数据是否为整数 74 * @param {String} str_data 待校验的数据 75 * @returns {Boolean}, true:是整数 76 **/ 77 isInteger : function (str_data) { 78 str_data = str_data || String(this); 79 var reg = /^[0-9]+$/; 80 return reg.test(str_data); 81 }, 82 83 84 /** 85 * @author Rui.Zhang 86 * @description 通过正则来判断数据是否为数字(包括小数) 87 * @param {String} str_data 待校验的数据 88 * @returns {Boolean}, true:是数字 89 **/ 90 isNumber : function (str_data) { 91 str_data = str_data || String(this); 92 var reg = /^[0-9]+(\.[0-9]+)?$/; 93 return reg.test(str_data); 94 }, 95 96 97 /** 98 * @author Rui.Zhang 99 * @description 判断数据是否为QQ 100 * @param {String} str_data 待校验的数据 101 * @returns {Boolean}, true:是QQ 102 **/ 103 isQQ : function (str_data) { 104 str_data = str_data || String(this); 105 var reg = /^[1-9][0-9]{4,10}$/; 106 return reg.test(str_data); 107 }, 108 109 110 /** 111 * @author Rui.Zhang 112 * @description 判断数据是否全为英文, 即全为字母 113 * @param {String} str_data 待校验的数据 114 * @returns {Boolean}, true:全为字母 115 **/ 116 isEnglish : function (str_data) { 117 str_data = str_data || String(this); 118 var reg = /^[a-zA-Z]+$/; 119 return reg.test(str_data); 120 }, 121 122 123 /** 124 * @author Rui.Zhang 125 * @description 判断数据是否为IPV4地址 126 * @param {String} str_data 待校验的数据 127 * @returns {Boolean}, true:是IPV4地址 128 **/ 129 isIpV4 : function (str_data) { 130 str_data = str_data || String(this); 131 var reg = /^([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.([0-9]|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])$/; 132 return reg.test(str_data); 133 }, 134 135 136 /** 137 * @author Rui.Zhang 138 * @description 判断数据是否为网址(URL),请传入满足http标准协议的链接 139 * @param {String} str_data 待校验的数据 140 * @param {Boolean} flag 是否使用严格模式,默认为false 141 * @returns {Boolean}, true:是网址 142 **/ 143 isUrl : function (str_data, flag) { 144 str_data = str_data || String(this); 145 flag = flag || false; 146 147 var regular = /^\b(((https?|ftp):\/\/)?[-a-z0-9]+(\.[-a-z0-9]+)*\.(?:com|edu|gov|int|mil|net|org|biz|info|name|museum|asia|coop|aero|[a-z][a-z]|((25[0-5])|(2[0-4]\d)|(1\d\d)|([1-9]\d)|\d))\b(\/[-a-z0-9_:\@&?=+,.!\/~%\$]*)?)$/i 148 var regular2 = /^((https?|ftp):\/\/)(www\.)?\S{0,30}\.\S+$/i 149 150 if (regular2.test(str_data) && !flag) { 151 return true; 152 } else if(regular.test(str_data) && flag) { 153 return true; 154 } else { 155 return false; 156 } 157 }, 158 159 160 /** 161 * @author Rui.Zhang 162 * @description 判断数据是否为邮箱 163 * @param {String} str_data 待校验的数据 164 * @returns {Boolean}, true:是邮箱 165 **/ 166 isEmail : function (str_data) { 167 str_data = str_data || String(this); 168 return /^([a-zA-Z0-9_-]{1,16})@([a-zA-Z0-9]{1,9})(\.[a-zA-Z0-9]{1,9}){0,3}(\.(?:com|net|org|edu|gov|mil|cn|us)){1,4}$/.test(str_data); 169 }, 170 171 172 /** 173 * @author Rui.Zhang 174 * @description 判断数据是否包含特殊字符, 包含中文标点 175 * @param {String} str_data 待校验的数据 176 * @returns {Boolean}, true:包含特殊字符, null表示传入参数为null 或者传入参数为空串 177 **/ 178 isContainsSpecialChar : function (str_data) { 179 if (str_data) { 180 //英文符号 181 var containSpecialForEnglish = RegExp(/[(\s)(\`)(\~)(\!)(\@)(\#)(\$)(\%)(\^)(\&)(\*)(\()(\))(\-)(\_)(\+)(\=)(\[)(\])(\{)(\})(\|)(\\)(\;)(\:)(\')(\")(\,)(\.)(\/)(\<)(\>)(\?)(\)]+/); 182 //中文符号 183 var containSpecialForChinese = RegExp(/[(\·)(\~)(\!)(\¥)(\%)(\……)(\&)(\*)(\()(\))(\——)(\【)(\】)(\;)(\:)(\”)(\“)(\’)(\,)(\《)(\。)(\》)(\?)(\、)(\‘)(\’)]+/); 184 185 str_data = str_data || String(this); 186 return (containSpecialForEnglish.test(str_data) || containSpecialForChinese.test(str_data)); 187 } 188 return null; 189 }, 190 191 192 /** 193 * @author Rui.Zhang 194 * @description 判断数据是否为手机号 195 * @param {String} str_data 待校验的数据 196 * @returns {Boolean}, true:是手机号 197 **/ 198 isMobile : function (str_data) { 199 str_data = str_data || String(this); 200 var length = str_data.length; 201 return length == 11 && /^1\d{10}$/.test(str_data); 202 }, 203 204 205 /** 206 * @author Rui.Zhang 207 * @description 判断数据是否为座机号(固定电话) 208 * @param {String} str_data 待校验的数据 209 * @returns {Boolean}, true:是座机号 210 **/ 211 isTelephone : function (str_data) { 212 str_data = str_data || String(this); 213 if (str_data.match(/^(([0\+]\d{2,3}-)?(0\d{2,3})-)(\d{7,8})(-(\d{3,}))?$/) == null) { 214 return false; 215 } else { 216 return true; 217 } 218 }, 219 220 221 /** 222 * @author Rui.Zhang 223 * @description 判断数据是否全为中文 224 * @param {String} str_data 待校验的数据 225 * @returns {Boolean}, true:全中文 226 **/ 227 isChinese : function (str_data) { 228 str_data = str_data || String(this); 229 return /^[\u4E00-\u9FA5]*$/.test(str_data); 230 }, 231 232 233 /** 234 * @author Rui.Zhang 235 * @description 判断是否为统一社会信用代码 236 * @param {String} str_data 待校验的数据 237 * @returns {Boolean}, true:社会信用代码正确 238 **/ 239 isCreditCode : function (str_data) { 240 var patrn = /^[0-9A-Z]+$/; 241 //18位校验及大写校验 242 if ((str_data.length != 18) || (patrn.test(str_data) == false)) { 243 return false; 244 } else { 245 var Ancode;//统一社会信用代码的每一个值 246 var Ancodevalue;//统一社会信用代码每一个值的权重 247 var total = 0; 248 var weightedfactors = [1, 3, 9, 27, 19, 26, 16, 17, 20, 29, 25, 13, 8, 24, 10, 30, 28];//加权因子 249 var str = '0123456789ABCDEFGHJKLMNPQRTUWXY'; 250 //不用I、O、S、V、Z 251 for (var i = 0; i < str_data.length - 1; i++) 252 { 253 Ancode = str_data.substring(i, i + 1); 254 Ancodevalue = str.indexOf(Ancode); 255 total = total + Ancodevalue * weightedfactors[i]; 256 //权重与加权因子相乘之和 257 } 258 var logiccheckcode = 31 - total % 31; 259 if (logiccheckcode == 31) { 260 logiccheckcode = 0; 261 } 262 var Str = "0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,J,K,L,M,N,P,Q,R,T,U,W,X,Y"; 263 var Array_Str = Str.split(','); 264 logiccheckcode = Array_Str[logiccheckcode]; 265 266 267 var checkcode = str_data.substring(17, 18); 268 if (logiccheckcode != checkcode) { 269 return false; 270 } 271 return true; 272 } 273 }, 274 275 276 /** 277 * @author Rui.Zhang 278 * @description 判断是否为银行卡号 279 * @param {String} str_cardNo 待校验的数据 280 * @returns {Boolean}, true:是银行卡号 281 **/ 282 isBankCard : function (str_cardNo) { 283 str_cardNo = str_cardNo || String(this); 284 if ("" == str_cardNo.trim() || undefined == str_cardNo) { 285 return false; 286 } 287 var lastNum = str_cardNo.substr(str_cardNo.length - 1, 1);//取出最后一位(与luhm进行比较) 288 289 var first15Num = str_cardNo.substr(0, str_cardNo.length - 1);//前15或18位 290 var newArr=new Array(); 291 for(var i=first15Num.length-1;i>-1;i--){ //前15或18位倒序存进数组 292 newArr.push(first15Num.substr(i,1)); 293 } 294 var arrJiShu=new Array(); //奇数位*2的积 <9 295 var arrJiShu2=new Array(); //奇数位*2的积 >9 296 297 var arrOuShu=new Array(); //偶数位数组 298 for(var j=0;j<newArr.length;j++){ 299 if((j+1)%2==1){//奇数位 300 if(parseInt(newArr[j])*2<9) 301 arrJiShu.push(parseInt(newArr[j])*2); 302 else 303 arrJiShu2.push(parseInt(newArr[j])*2); 304 } 305 else //偶数位 306 arrOuShu.push(newArr[j]); 307 } 308 309 var jishu_child1=new Array();//奇数位*2 >9 的分割之后的数组个位数 310 var jishu_child2=new Array();//奇数位*2 >9 的分割之后的数组十位数 311 for(var h=0;h<arrJiShu2.length;h++){ 312 jishu_child1.push(parseInt(arrJiShu2[h])%10); 313 jishu_child2.push(parseInt(arrJiShu2[h])/10); 314 } 315 316 var sumJiShu=0; //奇数位*2 < 9 的数组之和 317 var sumOuShu=0; //偶数位数组之和 318 var sumJiShuChild1=0; //奇数位*2 >9 的分割之后的数组个位数之和 319 var sumJiShuChild2=0; //奇数位*2 >9 的分割之后的数组十位数之和 320 var sumTotal=0; 321 for(var m=0;m<arrJiShu.length;m++){ 322 sumJiShu=sumJiShu+parseInt(arrJiShu[m]); 323 } 324 325 for(var n=0;n<arrOuShu.length;n++){ 326 sumOuShu=sumOuShu+parseInt(arrOuShu[n]); 327 } 328 329 for(var p=0;p<jishu_child1.length;p++){ 330 sumJiShuChild1=sumJiShuChild1+parseInt(jishu_child1[p]); 331 sumJiShuChild2=sumJiShuChild2+parseInt(jishu_child2[p]); 332 } 333 //计算总和 334 sumTotal=parseInt(sumJiShu)+parseInt(sumOuShu)+parseInt(sumJiShuChild1)+parseInt(sumJiShuChild2); 335 336 //计算Luhm值 337 var k= parseInt(sumTotal)%10==0?10:parseInt(sumTotal)%10; 338 var luhm= 10-k; 339 340 if(lastNum==luhm){ 341 return true; 342 } 343 else{ 344 return false; 345 } 346 }, 347 348 349 /** 350 * @author Rui.Zhang 351 * @description 判断是否为身份证号码 352 * @param {String} str_idCard 待校验的数据 353 * @param {String} [sex] 可选参数,传入时同时校验性别,不传则不校验性别,此值只可能 constant.WOMAN(0) 或者 constant.MAN(1) 354 * @returns {Boolean}, true:是身份证 355 **/ 356 isIdCard : function (str_idCard, sex) { 357 str_idCard = str_idCard || String(this); 358 var check = function() { 359 var factorArr = new Array(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2, 1); 360 var parityBit = new Array("1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2"); 361 var varArray = new Array(); 362 var lngProduct = 0; 363 var intCheckDigit; 364 var intStrLen = str_idCard.length; 365 var idNumber = str_idCard; 366 // initialize 367 if ((intStrLen != 15) && (intStrLen != 18)) { 368 return false; 369 } 370 // check and set value 371 for (i = 0; i < intStrLen; i++) { 372 varArray[i] = idNumber.charAt(i); 373 if ((varArray[i] < '0' || varArray[i] > '9') && (i != 17)) { 374 return false; 375 } else if (i < 17) { 376 varArray[i] = varArray[i] * factorArr[i]; 377 } 378 } 379 380 if (intStrLen == 18) { 381 //check date 382 var date8 = idNumber.substring(6, 14); 383 384 if (!/^[0-9]{8}$/.test(date8)) { 385 return false; 386 } 387 var year, month, day; 388 year = date8.substring(0, 4); 389 month = date8.substring(4, 6); 390 day = date8.substring(6, 8); 391 var iaMonthDays = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 392 if (year < 1700 || year > 2500) return false; 393 if (((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0)) iaMonthDays[1] = 29; 394 if (month < 1 || month > 12) return false; 395 if (day < 1 || day > iaMonthDays[month - 1]) return false; 396 397 // calculate the sum of the products 398 for (i = 0; i < 17; i++) { 399 lngProduct = lngProduct + varArray[i]; 400 } 401 // calculate the check digit 402 intCheckDigit = parityBit[lngProduct % 11]; 403 // check last digit 404 if (varArray[17] != intCheckDigit) { 405 return false; 406 } 407 } 408 //length is 15 409 else { 410 //check date 411 var date6 = idNumber.substring(6, 12); 412 413 if (!/^[0-9]{6}$/.test(date6)) { 414 return false; 415 } 416 var month, day, year; 417 year = date6.substring(0, 2); 418 month = date6.substring(2, 4); 419 day = date6.substring(4, 6); 420 if (!/^\d{2}$/.test(year)) return false; 421 if (month < 1 || month > 12) return false; 422 if (day < 1 || day > 31) return false; 423 } 424 return true; 425 } 426 if(str_idCard && check(str_idCard)) { 427 if(undefined != sex) { 428 var sexStr = undefined, tmp = 0; 429 if (15 == str_idCard.length) { 430 tmp = str_idCard.substring(str_idCard.length - 1, str_idCard.length); 431 } else if (18 == str_idCard.length) { 432 tmp = str_idCard.substr(str_idCard.length - 2, 1); 433 } 434 if (0 == tmp % 2) { 435 sexStr = 0; 436 } else { 437 sexStr = 1; 438 } 439 440 if (sex != sexStr) return false; 441 } 442 return true; 443 } 444 return false; 445 } 446 }, 447 448 449 450 /** 451 * @author Rui.Zhang 452 * @class 数据安全类 453 * @description 提供一些数据安全函数 454 */ 455 security : { 456 /** 457 * @author Rui.Zhang 458 * @description 生成uuid, 该函数已扩展至Mtils对象中 459 * @param {int} [len] 可选,生成uuid的长度,默认36位,建议20位以上 460 * @param {int} [radix] 可选,生成的进制基数,8是8进制,10是10进制等等 461 * @returns {String}, 生成的UUID 462 **/ 463 uuid : function (len, radix) { 464 var uuid; 465 var chars, i, r, uuid; 466 chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'.split(''); 467 uuid = []; 468 i = void 0; 469 radix = radix || chars.length; 470 if (len) { 471 i = 0; 472 while (i < len) { 473 uuid[i] = chars[0 | Math.random() * radix]; 474 i++; 475 } 476 } else { 477 r = void 0; 478 uuid[8] = uuid[13] = uuid[18] = uuid[23] = '-'; 479 uuid[14] = '4'; 480 i = 0; 481 while (i < 36) { 482 if (!uuid[i]) { 483 r = 0 | Math.random() * 16; 484 uuid[i] = chars[i === 19 ? r & 0x3 | 0x8 : r]; 485 } 486 i++; 487 } 488 } 489 return uuid.join(''); 490 }, 491 492 /** 493 * @author Rui.Zhang 494 * @description 密码强度检测 495 * @param {String} str_psw 待签名数据 496 * @returns {Object}, 检测结果,对象应为{"level":"2", "desc" : "检测提示:您的密码强度较差!"}, level为密码强度等级(1-5), desc为默认提示信息 497 * @example 示例:Mtils.security.passwordStrengthMeter("asd##AS123"), 您可以通过如下方式来得到密码强度等级<br /> 498 * @example Mtils.security.passwordStrengthMeter("asd##AS123").level; 499 * 也可以如下得到密码的检测信息:<br /> 500 * @example Mtils.security.checkerPasswordStrength("asd##AS123").level; 501 **/ 502 checkerPasswordStrength : function (str_psw) { 503 var a = /[^ \f\n\r\t\v\da-zA-Z]/, b = /\d/, c = /[a-zA-Z]/; 504 var d = /^[^ \f\n\r\t\v\da-zA-Z]+$/, e = /^\d+$/, f = /^[a-zA-Z]+$/; 505 if (6 <= str_psw.length) { 506 if (a.test(str_psw) && b.test(str_psw) && c.test(str_psw)) { 507 if (8 > str_psw.length) { 508 return {"level": "2", "desc": "检测提示:您的密码强度较差!"}; 509 } 510 if (12 > str_psw.length) { 511 return {"level": "3", "desc": "检测提示:您的密码强度良好!"}; 512 } 513 if (15 > str_psw.length) { 514 return {"level": "4", "desc": "检测提示:您的密码强度很高!"}; 515 } 516 if (15 <= str_psw.length) { 517 return {"level": "5", "desc": "检测提示:您的密码强度极高!"}; 518 } 519 } 520 if (a.test(str_psw) && b.test(str_psw) || a.test(str_psw) && c.test(str_psw) || b.test(str_psw) && c.test(str_psw)) { 521 if (8 > str_psw.length) { 522 return {"level": "2", "desc": "检测提示:您的密码强度较差!"}; 523 } 524 if (12 > str_psw.length) { 525 return {"level": "3", "desc": "检测提示:您的密码强度良好!"}; 526 } 527 if (15 > str_psw.length) { 528 return {"level": "4", "desc": "检测提示:您的密码强度很高!"}; 529 } 530 if (15 <= str_psw.length) { 531 return {"level": "4", "desc": "检测提示:您的密码强度很高!"}; 532 } 533 } 534 if (d.test(str_psw) || e.test(str_psw) || f.test(str_psw)) { 535 if (8 <= str_psw.length) { 536 return {"level": "2", "desc": "检测提示:您的密码强度较差!"}; 537 } 538 } 539 return {"level": "1", "desc": "检测提示:您的密码过于简单!"}; 540 } 541 return {"level": "-1", "desc": "检测提示:通常您的密码应该在6位以上!"}; 542 }, 543 544 545 /** 546 * @author Rui.Zhang 547 * @description 生成一个制定长度的随机数 548 * @param {String} [length] 可选,生成随机数的长度, 默认为5位 549 * @returns {Integer}, 生成的随机数 550 **/ 551 random : function(length) { 552 var result, tmp, flag = true; 553 if(length) { 554 while(flag) { 555 tmp = Math.random(); 556 if(tmp > 0.1) { 557 result = Math.floor(tmp * Math.pow(10, length)); 558 flag = false; 559 return result; 560 } 561 } 562 } else { 563 while(flag) { 564 tmp = Math.random(); 565 if(tmp > 0.1) { 566 result = Math.floor(tmp * Math.pow(10, 5)); 567 flag = false; 568 return result; 569 } 570 } 571 } 572 }, 573 574 575 /** 576 * @author Rui.Zhang 577 * @description 生成一个随机数,并介于最小值和最大值之间(包括最小值和最大值). 如果不传参数, 则返回一个大于0的随机数 578 * @param {String} [min] 可选,生成随机数的最小值 579 * @param {Array} [max] 可选,生成随机数的最大值 580 * @returns {Integer}, 生成的随机数 581 **/ 582 randomBetween : function(min, max) { 583 var length; 584 var result; 585 var tmp; 586 if(min && max) { 587 result = min + Math.floor( Math.random() * (max - min +1) ) ; 588 return result; 589 } 590 if(!min && !max) { 591 result = Math.floor(Math.random() * 100000); 592 return result; 593 } 594 595 if(min) { 596 length = 100000; 597 result = min + Math.floor(Math.random() * length); 598 return result; 599 } 600 }, 601 602 603 /** 604 * @author Rui.Zhang 605 * @description 对给定数据进行 hex_sha256 摘要计算 606 * @param {String} str_data 待计算的数据 607 * @returns {String}, hex_sha256 计算结果 608 **/ 609 hex_sha256 : function (str_data) { 610 /* SHA256 logical functions */ 611 var rotateRight = function (n, x) { 612 return ((x >>> n) | (x << (32 - n))); 613 } 614 var choice = function (x, y, z) { 615 return ((x & y) ^ (~x & z)); 616 } 617 var majority = function (x, y, z) { 618 return ((x & y) ^ (x & z) ^ (y & z)); 619 } 620 var sha256_Sigma0 = function (x) { 621 return (rotateRight(2, x) ^ rotateRight(13, x) ^ rotateRight(22, x)); 622 } 623 var sha256_Sigma1 = function (x) { 624 return (rotateRight(6, x) ^ rotateRight(11, x) ^ rotateRight(25, x)); 625 } 626 var sha256_sigma0 = function (x) { 627 return (rotateRight(7, x) ^ rotateRight(18, x) ^ (x >>> 3)); 628 } 629 var sha256_sigma1 = function (x) { 630 return (rotateRight(17, x) ^ rotateRight(19, x) ^ (x >>> 10)); 631 } 632 var sha256_expand = function (W, j) { 633 return (W[j & 0x0f] += sha256_sigma1(W[(j + 14) & 0x0f]) + W[(j + 9) & 0x0f] + 634 sha256_sigma0(W[(j + 1) & 0x0f])); 635 } 636 637 /* Hash constant words K: */ 638 var K256 = new Array( 639 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 640 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, 641 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 642 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, 643 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 644 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, 645 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 646 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, 647 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 648 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, 649 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 650 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, 651 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 652 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, 653 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 654 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2 655 ); 656 657 /* global arrays */ 658 var ihash, count, buffer; 659 var sha256_hex_digits = "0123456789abcdef"; 660 661 /* Add 32-bit integers with 16-bit operations (bug in some JS-interpreters: 662 overflow) */ 663 var safe_add = function (x, y) { 664 var lsw = (x & 0xffff) + (y & 0xffff); 665 var msw = (x >> 16) + (y >> 16) + (lsw >> 16); 666 return (msw << 16) | (lsw & 0xffff); 667 } 668 669 /* Initialise the SHA256 computation */ 670 var sha256_init = function () { 671 ihash = new Array(8); 672 count = new Array(2); 673 buffer = new Array(64); 674 count[0] = count[1] = 0; 675 ihash[0] = 0x6a09e667; 676 ihash[1] = 0xbb67ae85; 677 ihash[2] = 0x3c6ef372; 678 ihash[3] = 0xa54ff53a; 679 ihash[4] = 0x510e527f; 680 ihash[5] = 0x9b05688c; 681 ihash[6] = 0x1f83d9ab; 682 ihash[7] = 0x5be0cd19; 683 } 684 685 /* Transform a 512-bit message block */ 686 var sha256_transform = function () { 687 var a, b, c, d, e, f, g, h, T1, T2; 688 var W = new Array(16); 689 690 /* Initialize registers with the previous intermediate value */ 691 a = ihash[0]; 692 b = ihash[1]; 693 c = ihash[2]; 694 d = ihash[3]; 695 e = ihash[4]; 696 f = ihash[5]; 697 g = ihash[6]; 698 h = ihash[7]; 699 700 /* make 32-bit words */ 701 for (var i = 0; i < 16; i++) 702 W[i] = ((buffer[(i << 2) + 3]) | (buffer[(i << 2) + 2] << 8) | (buffer[(i << 2) + 1] 703 << 16) | (buffer[i << 2] << 24)); 704 705 for (var j = 0; j < 64; j++) { 706 T1 = h + sha256_Sigma1(e) + choice(e, f, g) + K256[j]; 707 if (j < 16) T1 += W[j]; 708 else T1 += sha256_expand(W, j); 709 T2 = sha256_Sigma0(a) + majority(a, b, c); 710 h = g; 711 g = f; 712 f = e; 713 e = safe_add(d, T1); 714 d = c; 715 c = b; 716 b = a; 717 a = safe_add(T1, T2); 718 } 719 720 /* Compute the current intermediate hash value */ 721 ihash[0] += a; 722 ihash[1] += b; 723 ihash[2] += c; 724 ihash[3] += d; 725 ihash[4] += e; 726 ihash[5] += f; 727 ihash[6] += g; 728 ihash[7] += h; 729 } 730 731 /* Read the next chunk of data and update the SHA256 computation */ 732 var sha256_update = function (data, inputLen) { 733 var i, index, curpos = 0; 734 /* Compute number of bytes mod 64 */ 735 index = ((count[0] >> 3) & 0x3f); 736 var remainder = (inputLen & 0x3f); 737 738 /* Update number of bits */ 739 if ((count[0] += (inputLen << 3)) < (inputLen << 3)) count[1]++; 740 count[1] += (inputLen >> 29); 741 742 /* Transform as many times as possible */ 743 for (i = 0; i + 63 < inputLen; i += 64) { 744 for (var j = index; j < 64; j++) 745 buffer[j] = data.charCodeAt(curpos++); 746 sha256_transform(); 747 index = 0; 748 } 749 750 /* Buffer remaining input */ 751 for (var j = 0; j < remainder; j++) 752 buffer[j] = data.charCodeAt(curpos++); 753 } 754 755 /* Finish the computation by operations such as padding */ 756 var sha256_final = function () { 757 var index = ((count[0] >> 3) & 0x3f); 758 buffer[index++] = 0x80; 759 if (index <= 56) { 760 for (var i = index; i < 56; i++) 761 buffer[i] = 0; 762 } else { 763 for (var i = index; i < 64; i++) 764 buffer[i] = 0; 765 sha256_transform(); 766 for (var i = 0; i < 56; i++) 767 buffer[i] = 0; 768 } 769 buffer[56] = (count[1] >>> 24) & 0xff; 770 buffer[57] = (count[1] >>> 16) & 0xff; 771 buffer[58] = (count[1] >>> 8) & 0xff; 772 buffer[59] = count[1] & 0xff; 773 buffer[60] = (count[0] >>> 24) & 0xff; 774 buffer[61] = (count[0] >>> 16) & 0xff; 775 buffer[62] = (count[0] >>> 8) & 0xff; 776 buffer[63] = count[0] & 0xff; 777 sha256_transform(); 778 } 779 780 /* Get the internal hash as a hex string */ 781 var sha256_encode_hex = function () { 782 var output = new String(); 783 for (var i = 0; i < 8; i++) { 784 for (var j = 28; j >= 0; j -= 4) 785 output += sha256_hex_digits.charAt((ihash[i] >>> j) & 0x0f); 786 } 787 return output; 788 } 789 790 sha256_init(); 791 sha256_update(str_data, str_data.length); 792 sha256_final(); 793 return sha256_encode_hex(); 794 }, 795 796 797 /** 798 * @author Rui.Zhang 799 * @description 对给定数据进行 base64 解码 800 * @param {String} str_data 待解码的数据 801 * @returns {String}, base64 解码后的数据 802 **/ 803 base64_decode : function (str_data) { 804 var output = ""; 805 var chr1, chr2, chr3; 806 var enc1, enc2, enc3, enc4; 807 var i = 0; 808 // private property 809 var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; 810 // private method for UTF-8 decoding 811 var _utf8_decode = function (utftext) { 812 var string = ""; 813 var i = 0; 814 var c = c1 = c2 = 0; 815 while (i < utftext.length) { 816 c = utftext.charCodeAt(i); 817 if (c < 128) { 818 string += String.fromCharCode(c); 819 i++; 820 } else if ((c > 191) && (c < 224)) { 821 c2 = utftext.charCodeAt(i + 1); 822 string += String.fromCharCode(((c & 31) << 6) | (c2 & 63)); 823 i += 2; 824 } else { 825 c2 = utftext.charCodeAt(i + 1); 826 c3 = utftext.charCodeAt(i + 2); 827 string += String.fromCharCode(((c & 15) << 12) | ((c2 & 63) << 6) | (c3 & 63)); 828 i += 3; 829 } 830 } 831 return string; 832 } 833 834 str_data = str_data.replace(/[^A-Za-z0-9\+\/\=]/g, ""); 835 while (i < str_data.length) { 836 enc1 = _keyStr.indexOf(str_data.charAt(i++)); 837 enc2 = _keyStr.indexOf(str_data.charAt(i++)); 838 enc3 = _keyStr.indexOf(str_data.charAt(i++)); 839 enc4 = _keyStr.indexOf(str_data.charAt(i++)); 840 chr1 = (enc1 << 2) | (enc2 >> 4); 841 chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); 842 chr3 = ((enc3 & 3) << 6) | enc4; 843 output = output + String.fromCharCode(chr1); 844 if (enc3 != 64) { 845 output = output + String.fromCharCode(chr2); 846 } 847 if (enc4 != 64) { 848 output = output + String.fromCharCode(chr3); 849 } 850 } 851 output = _utf8_decode(output); 852 return output; 853 }, 854 855 856 /** 857 * @author Rui.Zhang 858 * @description 对给定数据进行 base64 编码 859 * @param {String} str_data 待编码的数据 860 * @returns {String}, base64 编码后的数据 861 **/ 862 base64_encode : function (str_data) { 863 // private property 864 var _keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/="; 865 // private method for UTF-8 encoding 866 var _utf8_encode = function (string) { 867 string = string.replace(/\r\n/g, "\n"); 868 var utftext = ""; 869 for (var n = 0; n < string.length; n++) { 870 var c = string.charCodeAt(n); 871 if (c < 128) { 872 utftext += String.fromCharCode(c); 873 } else if ((c > 127) && (c < 2048)) { 874 utftext += String.fromCharCode((c >> 6) | 192); 875 utftext += String.fromCharCode((c & 63) | 128); 876 } else { 877 utftext += String.fromCharCode((c >> 12) | 224); 878 utftext += String.fromCharCode(((c >> 6) & 63) | 128); 879 utftext += String.fromCharCode((c & 63) | 128); 880 } 881 882 } 883 return utftext; 884 } 885 886 887 var output = ""; 888 var chr1, chr2, chr3, enc1, enc2, enc3, enc4; 889 var i = 0; 890 str_data = _utf8_encode(str_data); 891 while (i < str_data.length) { 892 chr1 = str_data.charCodeAt(i++); 893 chr2 = str_data.charCodeAt(i++); 894 chr3 = str_data.charCodeAt(i++); 895 enc1 = chr1 >> 2; 896 enc2 = ((chr1 & 3) << 4) | (chr2 >> 4); 897 enc3 = ((chr2 & 15) << 2) | (chr3 >> 6); 898 enc4 = chr3 & 63; 899 if (isNaN(chr2)) { 900 enc3 = enc4 = 64; 901 } else if (isNaN(chr3)) { 902 enc4 = 64; 903 } 904 output = output + 905 _keyStr.charAt(enc1) + _keyStr.charAt(enc2) + 906 _keyStr.charAt(enc3) + _keyStr.charAt(enc4); 907 } 908 return output; 909 }, 910 911 912 /** 913 * @author Rui.Zhang 914 * @description 对给定数据进行 sha1 摘要计算 915 * @param {String} str_data 待计算的数据 916 * @returns {String}, sha1 计算结果 917 **/ 918 hex_sha1 : function (str_data) { 919 var hexcase = 0; 920 /* hex output format. 0 - lowercase; 1 - uppercase */ 921 var chrsz = 8; 922 /* bits per input character. 8 - ASCII; 16 - Unicode */ 923 924 /* 925 * Convert an array of big-endian words to a hex string. 926 */ 927 var binb2hex = function (binarray) { 928 var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; 929 var str = ""; 930 for (var i = 0; i < binarray.length * 4; i++) { 931 str += hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8 + 4)) & 0xF) + hex_tab.charAt((binarray[i >> 2] >> ((3 - i % 4) * 8)) & 0xF); 932 } 933 return str; 934 } 935 936 /* 937 * Bitwise rotate a 32-bit number to the left. 938 */ 939 var rol = function (num, cnt) { 940 return (num << cnt) | (num >>> (32 - cnt)); 941 } 942 943 /* 944 * Calculate the SHA-1 of an array of big-endian words, and a bit length 945 */ 946 var core_sha1 = function (x, len) { 947 /* append padding */ 948 x[len >> 5] |= 0x80 << (24 - len % 32); 949 x[((len + 64 >> 9) << 4) + 15] = len; 950 951 var w = Array(80); 952 var a = 1732584193; 953 var b = -271733879; 954 var c = -1732584194; 955 var d = 271733878; 956 var e = -1009589776; 957 958 for (var i = 0; i < x.length; i += 16) { 959 var olda = a; 960 var oldb = b; 961 var oldc = c; 962 var oldd = d; 963 var olde = e; 964 965 for (var j = 0; j < 80; j++) { 966 if (j < 16) w[j] = x[i + j]; 967 else w[j] = rol(w[j - 3] ^ w[j - 8] ^ w[j - 14] ^ w[j - 16], 1); 968 var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)), safe_add(safe_add(e, w[j]), sha1_kt(j))); 969 e = d; 970 d = c; 971 c = rol(b, 30); 972 b = a; 973 a = t; 974 } 975 976 a = safe_add(a, olda); 977 b = safe_add(b, oldb); 978 c = safe_add(c, oldc); 979 d = safe_add(d, oldd); 980 e = safe_add(e, olde); 981 } 982 return Array(a, b, c, d, e); 983 984 } 985 986 /* 987 * Convert an 8-bit or 16-bit string to an array of big-endian words 988 * In 8-bit function, characters >255 have their hi-byte silently ignored. 989 */ 990 var str2binb = function (str) { 991 var bin = Array(); 992 var mask = (1 << chrsz) - 1; 993 for (var i = 0; i < str.length * chrsz; i += chrsz) 994 bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i % 32); 995 return bin; 996 } 997 998 /* 999 * Add integers, wrapping at 2^32. This uses 16-bit operations internally 1000 * to work around bugs in some JS interpreters. 1001 */ 1002 var safe_add = function (x, y) { 1003 var lsw = (x & 0xFFFF) + (y & 0xFFFF); 1004 var msw = (x >> 16) + (y >> 16) + (lsw >> 16); 1005 return (msw << 16) | (lsw & 0xFFFF); 1006 } 1007 1008 /* 1009 * Perform the appropriate triplet combination function for the current 1010 * iteration 1011 */ 1012 var sha1_ft = function (t, b, c, d) { 1013 if (t < 20) return (b & c) | ((~b) & d); 1014 if (t < 40) return b ^ c ^ d; 1015 if (t < 60) return (b & c) | (b & d) | (c & d); 1016 return b ^ c ^ d; 1017 } 1018 1019 /* 1020 * Determine the appropriate additive constant for the current iteration 1021 */ 1022 var sha1_kt = function (t) { 1023 return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : (t < 60) ? -1894007588 : -899497514; 1024 } 1025 1026 return binb2hex(core_sha1(str2binb(str_data), str_data.length * chrsz)); 1027 }, 1028 1029 1030 /** 1031 * @author Rui.Zhang 1032 * @description 对给定数据进行 md5 摘要计算 1033 * @param {String} str_data 待计算的数据 1034 * @returns {String}, md5 计算结果 1035 **/ 1036 hex_md5 : function (str_data) { 1037 var chrsz = 8; 1038 /* bits per input character. 8 - ASCII; 16 - Unicode */ 1039 var hexcase = 0; 1040 /* hex output format. 0 - lowercase; 1 - uppercase */ 1041 1042 /* 1043 * Convert an array of little-endian words to a base-64 string 1044 */ 1045 var binl2b64 = function (binarray) { 1046 var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 1047 var str = ""; 1048 for (var i = 0; i < binarray.length * 4; i += 3) { 1049 var triplet = (((binarray[i >> 2] >> 8 * ( i % 4)) & 0xFF) << 16) 1050 | (((binarray[i + 1 >> 2] >> 8 * ((i + 1) % 4)) & 0xFF) << 8 ) 1051 | ((binarray[i + 2 >> 2] >> 8 * ((i + 2) % 4)) & 0xFF); 1052 for (var j = 0; j < 4; j++) { 1053 if (i * 8 + j * 6 > binarray.length * 32) str += b64pad; 1054 else str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F); 1055 } 1056 } 1057 return str; 1058 } 1059 1060 /* 1061 * These functions implement the four basic operations the algorithm uses. 1062 */ 1063 var md5_cmn = function (q, a, b, x, s, t) { 1064 return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b); 1065 } 1066 var md5_ff = function (a, b, c, d, x, s, t) { 1067 return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t); 1068 } 1069 var md5_gg = function (a, b, c, d, x, s, t) { 1070 return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t); 1071 } 1072 var md5_hh = function (a, b, c, d, x, s, t) { 1073 return md5_cmn(b ^ c ^ d, a, b, x, s, t); 1074 } 1075 var md5_ii = function (a, b, c, d, x, s, t) { 1076 return md5_cmn(c ^ (b | (~d)), a, b, x, s, t); 1077 } 1078 1079 /* 1080 * Convert an array of little-endian words to a base-64 string 1081 */ 1082 var binl2b64 = function (binarray) { 1083 var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 1084 var str = ""; 1085 for (var i = 0; i < binarray.length * 4; i += 3) { 1086 var triplet = (((binarray[i >> 2] >> 8 * ( i % 4)) & 0xFF) << 16) 1087 | (((binarray[i + 1 >> 2] >> 8 * ((i + 1) % 4)) & 0xFF) << 8 ) 1088 | ((binarray[i + 2 >> 2] >> 8 * ((i + 2) % 4)) & 0xFF); 1089 for (var j = 0; j < 4; j++) { 1090 if (i * 8 + j * 6 > binarray.length * 32) str += b64pad; 1091 else str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F); 1092 } 1093 } 1094 return str; 1095 } 1096 1097 /* 1098 * Calculate the MD5 of an array of little-endian words, and a bit length 1099 */ 1100 var core_md5 = function (x, len) { 1101 /* append padding */ 1102 x[len >> 5] |= 0x80 << ((len) % 32); 1103 x[(((len + 64) >>> 9) << 4) + 14] = len; 1104 1105 var a = 1732584193; 1106 var b = -271733879; 1107 var c = -1732584194; 1108 var d = 271733878; 1109 1110 for (var i = 0; i < x.length; i += 16) { 1111 var olda = a; 1112 var oldb = b; 1113 var oldc = c; 1114 var oldd = d; 1115 1116 a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936); 1117 d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586); 1118 c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819); 1119 b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330); 1120 a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897); 1121 d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426); 1122 c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341); 1123 b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983); 1124 a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416); 1125 d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417); 1126 c = md5_ff(c, d, a, b, x[i + 10], 17, -42063); 1127 b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162); 1128 a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682); 1129 d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101); 1130 c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290); 1131 b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329); 1132 1133 a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510); 1134 d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632); 1135 c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713); 1136 b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302); 1137 a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691); 1138 d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083); 1139 c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335); 1140 b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848); 1141 a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438); 1142 d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690); 1143 c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961); 1144 b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501); 1145 a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467); 1146 d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784); 1147 c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473); 1148 b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734); 1149 1150 a = md5_hh(a, b, c, d, x[i + 5], 4, -378558); 1151 d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463); 1152 c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562); 1153 b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556); 1154 a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060); 1155 d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353); 1156 c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632); 1157 b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640); 1158 a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174); 1159 d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222); 1160 c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979); 1161 b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189); 1162 a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487); 1163 d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835); 1164 c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520); 1165 b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651); 1166 1167 a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844); 1168 d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415); 1169 c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905); 1170 b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055); 1171 a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571); 1172 d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606); 1173 c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523); 1174 b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799); 1175 a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359); 1176 d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744); 1177 c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380); 1178 b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649); 1179 a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070); 1180 d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379); 1181 c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259); 1182 b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551); 1183 1184 a = safe_add(a, olda); 1185 b = safe_add(b, oldb); 1186 c = safe_add(c, oldc); 1187 d = safe_add(d, oldd); 1188 } 1189 return Array(a, b, c, d); 1190 } 1191 1192 1193 /* 1194 * These functions implement the four basic operations the algorithm uses. 1195 */ 1196 var md5_cmn = function (q, a, b, x, s, t) { 1197 return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b); 1198 } 1199 1200 /* 1201 * Convert an array of little-endian words to a hex string. 1202 */ 1203 var binl2hex = function (binarray) { 1204 var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; 1205 var str = ""; 1206 for (var i = 0; i < binarray.length * 4; i++) { 1207 str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF) + 1208 hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 )) & 0xF); 1209 } 1210 return str; 1211 } 1212 1213 /* 1214 * Convert a string to an array of little-endian words 1215 * If chrsz is ASCII, characters >255 have their hi-byte silently ignored. 1216 */ 1217 var str2binl = function (str) { 1218 var bin = Array(); 1219 var mask = (1 << chrsz) - 1; 1220 for (var i = 0; i < str.length * chrsz; i += chrsz) 1221 bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (i % 32); 1222 return bin; 1223 } 1224 1225 /* 1226 * Add integers, wrapping at 2^32. This uses 16-bit operations internally 1227 * to work around bugs in some JS interpreters. 1228 */ 1229 var safe_add = function (x, y) { 1230 var lsw = (x & 0xFFFF) + (y & 0xFFFF); 1231 var msw = (x >> 16) + (y >> 16) + (lsw >> 16); 1232 return (msw << 16) | (lsw & 0xFFFF); 1233 } 1234 1235 /* 1236 * Bitwise rotate a 32-bit number to the left. 1237 */ 1238 var bit_rol = function (num, cnt) { 1239 return (num << cnt) | (num >>> (32 - cnt)); 1240 } 1241 1242 return binl2hex(core_md5(str2binl(str_data), str_data.length * chrsz)); 1243 } 1244 }, 1245 1246 1247 1248 /** 1249 * @author Rui.Zhang 1250 * @class 扩展类 1251 * @description 提供一些扩展加强的函数 1252 */ 1253 extention : { 1254 /** 1255 * @author Rui.Zhang 1256 * @description 数组排序;可以排序简单数组或对象数组; 1257 * @description 例如;根据年龄排序以下对象数组. <br> var arr = [{name:"张三", age:11}, {name:"李四", age:13}]; <br> result = arr.sort(sortBy("age", false)); <br> 排序结果为 [{name:"李四", age:13}, {name:"张三", age:11}];<br> 又例如排序简单数组 arr = [1,2,3,4,5];<br>正序排序调用 arr.sort(Mtils.extention.sortBy(true); <br> 逆序排序用 arr.sort(Mtils.extention.sortBy(false); 1258 * @param {string} arg1 排序对象数组时;此参数为欲排序的属性;当排序简单数组时,此参数含义与第二个参数相同 1259 * @param {boolean} arg2 true/升序;false/降序 1260 * @returns {boolean} 1261 **/ 1262 sortBy : function(attr, rev) { 1263 if(!Mtils.isString(attr)) rev = attr; 1264 //第二个参数没有传递 默认升序排列 1265 if(rev == undefined){ 1266 rev = 1; 1267 }else{ 1268 rev = (rev) ? 1 : -1; 1269 } 1270 1271 return function(a,b){ 1272 if(Mtils.isString(attr)) { 1273 if(Mtils.isObject(a)) a = a[attr]; 1274 if(Mtils.isObject(b)) b = b[attr]; 1275 } 1276 1277 if(a < b){ 1278 return rev * -1; 1279 } 1280 if(a > b){ 1281 return rev * 1; 1282 } 1283 return 0; 1284 } 1285 }, 1286 1287 1288 /** 1289 * @author Rui.Zhang 1290 * @description 将一个对象进行拷贝,可以传入多个对象,第一个参数会覆盖第二个参数的属性.该对象已扩展到Mtils 1291 * @param {any} arg1 欲拷贝属性的对象1,若为true则为深拷贝 1292 * @param {any} arg2 欲拷贝属性的对象2 1293 * @returns {boolean} 1294 **/ 1295 extend : function() { 1296 var src, copyIsArray, copy, name, options, clone, 1297 target = arguments[0] || {}, 1298 i = 1, 1299 length = arguments.length, 1300 deep = false; 1301 1302 // Handle a deep copy situation 1303 if ( typeof target === "boolean" ) { 1304 deep = target; 1305 target = arguments[1] || {}; 1306 // skip the boolean and the target 1307 i = 2; 1308 } 1309 1310 // Handle case when target is a string or something (possible in deep copy) 1311 if ( !Mtils.isObject(target)) { 1312 target = {}; 1313 } 1314 1315 for ( ; i < length; i++ ) { 1316 // Only deal with non-null/undefined values 1317 if ( (options = arguments[ i ]) != null ) { 1318 // Extend the base object 1319 for ( name in options ) { 1320 src = target[ name ]; 1321 copy = options[ name ]; 1322 1323 // Prevent never-ending loop 1324 if ( target === copy ) { 1325 continue; 1326 } 1327 1328 // Recurse if we're merging plain objects or arrays 1329 if ( deep && copy && ( Mtils.isEmpty(copy) || (copyIsArray = Mtils.extend(copy)) ) ) { 1330 if ( copyIsArray ) { 1331 copyIsArray = false; 1332 clone = src && Mtils.isArray(src) ? src : []; 1333 1334 } else { 1335 clone = src && Mtils.isEmpty(src) ? src : {}; 1336 } 1337 1338 // Never move original objects, clone them 1339 target[ name ] = Mtils.extend( deep, clone, copy ); 1340 1341 // Don't bring in undefined values 1342 } else if ( copy !== undefined ) { 1343 target[ name ] = copy; 1344 } 1345 } 1346 } 1347 } 1348 1349 // Return the modified object 1350 return target; 1351 }, 1352 1353 /** 1354 * @author Rui.Zhang 1355 * @description 判断数据中是否包含指定数据,该对象已经扩展到Array,String. 1356 * @param {any} param 被搜寻的数据 1357 * @param {any} include 欲搜寻的数据 1358 * @returns {boolean} 1359 **/ 1360 includes : function (param, include) { 1361 if(1 == arguments.length && Mtils.extention !== this) { 1362 include = param; 1363 return -1 !== this.indexOf(include); 1364 } else if(2 === arguments.length) { 1365 return -1 !== param.indexOf(include); 1366 } 1367 }, 1368 1369 1370 /** 1371 * @author Rui.Zhang 1372 * @description 将非严格模式的JSON字符串转换为JSON对象, 也可用于字符串转普通数据类型, 如'true'转为true, 该函数已扩展到window/Mtils对象中; 1373 * @param {String} str 待转换的JSON字符串 1374 * @returns {any} 1375 **/ 1376 strToJson : function (str) { 1377 return (new Function("return " + str))(); 1378 }, 1379 1380 1381 /** 1382 * @author Rui.Zhang 1383 * @description 返回服务器的当前时间时间,可以格式化后返回,默认返回时间戳. 该函数已扩展到Date/Mtils对象中 1384 * @description 注意:当在本地使用此函数将会返回本地时间,服务器请求地址为:location.href 1385 * @param {String} format 时间格式化参数 1386 * @returns {float/Int} 1387 **/ 1388 now : function (format) { 1389 var timestamp = null; 1390 var ajax = null; 1391 if("file:" != location.protocol) { 1392 try{ 1393 ajax = new ActiveXObject("microsoft.xmlhttp"); 1394 }catch(e1){ 1395 try{ 1396 ajax = new XMLHttpRequest(); 1397 }catch(e2){ 1398 console.log("你的浏览器中不支持异步对象,请换浏览器"); 1399 } 1400 } 1401 ajax.open("HEAD", location.href, false); 1402 ajax.send(null); 1403 timestamp = ajax.getResponseHeader("Date"); 1404 } else { 1405 timestamp = new Date().getTime(); 1406 } 1407 1408 1409 if(!timestamp) return null; 1410 timestamp = new Date(timestamp).getTime(); 1411 1412 if(format) 1413 return Mtils.extention.formatDate(timestamp, format); 1414 return timestamp; 1415 }, 1416 1417 1418 /** 1419 * @author Rui.Zhang 1420 * @description 加法函数,用来得到精确的加法结果, 该函数已扩展到Math对象中 1421 * @param {Float/Int} arg1 数值1 1422 * @param {Float/Int} arg2 数值2 1423 * @returns {float/Int} 1424 **/ 1425 accAdd : function (arg1, arg2) { 1426 var r1, r2, m, c; 1427 try { 1428 r1 = arg1.toString().split(".")[1].length; 1429 } 1430 catch (e) { 1431 r1 = 0; 1432 } 1433 try { 1434 r2 = arg2.toString().split(".")[1].length; 1435 } 1436 catch (e) { 1437 r2 = 0; 1438 } 1439 c = Math.abs(r1 - r2); 1440 m = Math.pow(10, Math.max(r1, r2)); 1441 if (c > 0) { 1442 var cm = Math.pow(10, c); 1443 if (r1 > r2) { 1444 arg1 = Number(arg1.toString().replace(".", "")); 1445 arg2 = Number(arg2.toString().replace(".", "")) * cm; 1446 } else { 1447 arg1 = Number(arg1.toString().replace(".", "")) * cm; 1448 arg2 = Number(arg2.toString().replace(".", "")); 1449 } 1450 } else { 1451 arg1 = Number(arg1.toString().replace(".", "")); 1452 arg2 = Number(arg2.toString().replace(".", "")); 1453 } 1454 return (arg1 + arg2) / m; 1455 }, 1456 1457 1458 /** 1459 * @author Rui.Zhang 1460 * @description 减法函数,用来得到精确的减法结果, 该函数已扩展到Math对象中 1461 * @param {Float/Int} arg1 数值1 1462 * @param {Float/Int} arg2 数值2 1463 * @returns {float/Int} 1464 **/ 1465 accSub : function (arg1, arg2) { 1466 var r1, r2, m, n; 1467 try { 1468 r1 = arg1.toString().split(".")[1].length; 1469 } 1470 catch (e) { 1471 r1 = 0; 1472 } 1473 try { 1474 r2 = arg2.toString().split(".")[1].length; 1475 } 1476 catch (e) { 1477 r2 = 0; 1478 } 1479 m = Math.pow(10, Math.max(r1, r2)); //last modify by deeka //动态控制精度长度 1480 n = (r1 >= r2) ? r1 : r2; 1481 return ((arg1 * m - arg2 * m) / m).toFixed(n); 1482 }, 1483 1484 1485 /** 1486 * @author Rui.Zhang 1487 * @description 减法乘法,用来得到精确的乘法结果, 该函数已扩展到Math对象中 1488 * @param {Float/Int} arg1 数值1 1489 * @param {Float/Int} arg2 数值2 1490 * @returns {float/Int} 1491 **/ 1492 accMul : function (arg1, arg2) { 1493 var m = 0, s1 = arg1.toString(), s2 = arg2.toString(); 1494 try { 1495 m += s1.split(".")[1].length; 1496 } 1497 catch (e) { 1498 } 1499 try { 1500 m += s2.split(".")[1].length; 1501 } 1502 catch (e) { 1503 } 1504 return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m); 1505 }, 1506 1507 1508 /** 1509 * @author Rui.Zhang 1510 * @description 除法函数,用来得到精确的除法结果, 该函数已扩展到Math对象中 1511 * @param {Float/Int} arg1 数值1 1512 * @param {Float/Int} arg2 数值2 1513 * @returns {float/Int} 1514 **/ 1515 accDiv : function (arg1, arg2) { 1516 var t1 = 0, t2 = 0, r1, r2; 1517 try { 1518 t1 = arg1.toString().split(".")[1].length; 1519 } 1520 catch (e) { 1521 } 1522 try { 1523 t2 = arg2.toString().split(".")[1].length; 1524 } 1525 catch (e) { 1526 } 1527 r1 = Number(arg1.toString().replace(".", "")); 1528 r2 = Number(arg2.toString().replace(".", "")); 1529 return (r1 / r2) * Math.pow(10, t2 - t1); 1530 }, 1531 1532 1533 /** 1534 * @author Rui.Zhang 1535 * @description 时间格式化,该函数已扩展到Date对象中 1536 * @param {String} timestamp 时间戳 1537 * @param {String} pattern 格式化字符串,如 "yy-MM-dd hh:mm:ss" 1538 * @returns {String}, 格式化后的时间 1539 * @example Mtils.text.formatDate(new Date().getTime(), "yy年MM月dd日 hh时mm分ss秒"); 1540 * @example new Date().format("yy年MM月dd日 hh时mm分ss秒"); 1541 **/ 1542 formatDate : function (timestamp, pattern) { 1543 if(this !== Mtils.extention) { 1544 pattern = timestamp || "yyyy-MM-dd"; 1545 timestamp = this; 1546 } else { 1547 pattern = pattern || "yyyy-MM-dd"; 1548 } 1549 1550 1551 var tmp = new Date(timestamp); 1552 var o = { 1553 "M+": tmp.getMonth() + 1, //month 1554 "d+": tmp.getDate(), //day 1555 "h+": tmp.getHours(), //hour 1556 "m+": tmp.getMinutes(), //minute 1557 "s+": tmp.getSeconds(), //second 1558 "q+": Math.floor((tmp.getMonth() + 3) / 3), //quarter 1559 "S": tmp.getMilliseconds() //millisecond 1560 } 1561 1562 if (/(y+)/.test(pattern)) { 1563 pattern = pattern.replace(RegExp.$1, (tmp.getFullYear() + "").substr(4 - RegExp.$1.length)); 1564 } 1565 1566 for (var k in o) { 1567 if (new RegExp("(" + k + ")").test(pattern)) { 1568 pattern = pattern.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length)); 1569 } 1570 } 1571 return pattern; 1572 }, 1573 1574 1575 /** 1576 * @author Rui.Zhang 1577 * @description 去除数组中的重复元素, 该函数已扩展到Mtils对象中 1578 * @param {Arr} array 待去重数组 1579 * @returns {Arr}, 去重后的数组 1580 **/ 1581 uniqueArray : function(arr) { 1582 var _this = arr || this; 1583 if(undefined === _this || null === _this || 0 === _this.length) return []; 1584 _this.sort(); 1585 var re=[_this[0]]; 1586 for(var i = 1; i < _this.length; i++) { 1587 if( _this[i] !== re[re.length-1]) { 1588 re.push(_this[i]); 1589 } 1590 } 1591 return re; 1592 }, 1593 1594 1595 /** 1596 * @author Rui.Zhang 1597 * @description 清除文本右边的空白字符,包括空格/Tab/换行等, 该函数已扩展到String对象中 1598 * @param {String} str_data 欲清除的文本 1599 * @returns {String}, 清除空白字符后的文本 1600 **/ 1601 rtrim : function (str_data) { 1602 str_data = str_data || String(this); 1603 return str_data.replace(/(\s*| *)$/, ""); 1604 }, 1605 1606 1607 /** 1608 * @author Rui.Zhang 1609 * @description 清除文本左边的空白字符,包括空格/Tab/换行等, 该函数已扩展到String对象中 1610 * @param {String} str_data 欲清除的文本 1611 * @returns {String}, 清除空白字符后的文本 1612 **/ 1613 ltrim : function (str_data) { 1614 str_data = str_data || String(this); 1615 return str_data.replace(/^(\s*| *)/, ""); 1616 }, 1617 1618 1619 /** 1620 * @author Rui.Zhang 1621 * @description 清除文本中所有的空白字符,包括空格/Tab/换行等, 该函数已扩展到String对象中 1622 * @param {String} str_data 欲清除的文本 1623 * @returns {String}, 清除空白字符后的文本 1624 **/ 1625 atrim : function (str_data) { 1626 str_data = str_data || String(this); 1627 return str_data.replace(/\s+/g, ""); 1628 }, 1629 1630 1631 /** 1632 * @author Rui.Zhang 1633 * @description 替换源文本中的所有目标文本, 该函数已扩展到String对象中 1634 * @param {String} str_origin 被替换的文本 1635 * @param {String} str_target 欲替换的文本 1636 * @param {String} str_replace 用作替换的文本 1637 * @returns {String}, 替换后的文本 1638 **/ 1639 replaceAll : function (str_origin, str_target, str_replace) { 1640 if(this !== Mtils.extention) { 1641 str_replace = str_target; 1642 str_target = str_origin; 1643 str_origin = this; 1644 } 1645 return str_origin.replace(new RegExp(str_target, "gm"), str_replace) 1646 }, 1647 1648 1649 /** 1650 * @author Rui.Zhang 1651 * @description 判断变量是否为普通对象, 该函数已扩展到Mtils对象中 1652 * @param {varName} varName 待判断数据类型的变量 1653 * @returns {boolean}, true/false 1654 **/ 1655 isObject : function(varName) { 1656 return varName !== null && Mtils.utils.getVarType(varName) === '[object Object]'; 1657 }, 1658 1659 1660 /** 1661 * @author Rui.Zhang 1662 * @description 判断变量是否为window对象, 该函数已扩展到Mtils对象中 1663 * @param {varName} varName 待判断数据类型的变量 1664 * @returns {boolean}, true/false 1665 **/ 1666 isWindow : function(varName) { 1667 return varName && varName.window === varName; 1668 }, 1669 1670 1671 /** 1672 * @author Rui.Zhang 1673 * @description 判断变量是否为文件, 该函数已扩展到Mtils对象中 1674 * @param {varName} varName 待判断数据类型的变量 1675 * @returns {boolean}, true/false 1676 **/ 1677 isFile : function(varName) { 1678 return Mtils.utils.getVarType(varName) === '[object File]'; 1679 }, 1680 1681 1682 /** 1683 * @author Rui.Zhang 1684 * @description 判断变量是否为表单数据, 该函数已扩展到Mtils对象中 1685 * @param {varName} varName 待判断数据类型的变量 1686 * @returns {boolean}, true/false 1687 **/ 1688 isFormData : function(varName) { 1689 return Mtils.utils.getVarType(varName) === '[object FormData]'; 1690 }, 1691 1692 1693 /** 1694 * @author Rui.Zhang 1695 * @description 判断变量是否为正则表达式, 该函数已扩展到Mtils对象中 1696 * @param {varName} varName 待判断数据类型的变量 1697 * @returns {boolean}, true/false 1698 **/ 1699 isRegExp : function(varName) { 1700 return Mtils.utils.getVarType(varName) === '[object RegExp]'; 1701 }, 1702 1703 1704 /** 1705 * @author Rui.Zhang 1706 * @description 判断变量是否为数组, 该函数已扩展到Mtils对象中 1707 * @param {varName} varName 待判断数据类型的变量 1708 * @returns {boolean}, true/false 1709 **/ 1710 isArray : Array.isArray, 1711 1712 1713 /** 1714 * @author Rui.Zhang 1715 * @description 判断变量是否为NaN 1716 * @param {varName} varName 待判断数据类型的变量 1717 * @returns {boolean}, true/false 1718 **/ 1719 isNaN : function(val) { 1720 return Mtils.isNumber(val) && val !== val; 1721 }, 1722 1723 /** 1724 * @author Rui.Zhang 1725 * @description 通过数据类型判断变量是否为数字, 该函数已扩展到Mtils对象中 1726 * @param {varName} varName 待判断数据类型的变量 1727 * @returns {boolean}, true/false 1728 **/ 1729 isNumber : function(varName) { 1730 return Mtils.utils.getVarType(varName) === '[object Number]'; 1731 }, 1732 1733 1734 /** 1735 * @author Rui.Zhang 1736 * @description 判断变量是否为函数, 该函数已扩展到Mtils对象中 1737 * @param {varName} varName 待判断数据类型的变量 1738 * @returns {boolean}, true/false 1739 **/ 1740 isFunction : function(varName) { 1741 return Mtils.utils.getVarType(varName) === '[object Function]'; 1742 }, 1743 1744 1745 /** 1746 * @author Rui.Zhang 1747 * @description 判断变量是否为日期, 该函数已扩展到Mtils对象中 1748 * @param {varName} varName 待判断数据类型的变量 1749 * @returns {boolean}, true/false 1750 **/ 1751 isDate : function(varName) { 1752 return Mtils.utils.getVarType(varName) === '[object Date]'; 1753 }, 1754 1755 1756 /** 1757 * @author Rui.Zhang 1758 * @description 判断变量是否为字符串, 该函数已扩展到Mtils对象中 1759 * @param {varName} varName 待判断数据类型的变量 1760 * @returns {boolean}, true/false 1761 **/ 1762 isString : function(varName) { 1763 return Mtils.utils.getVarType(varName) === '[object String]'; 1764 }, 1765 }, 1766 1767 1768 1769 /** 1770 * @author Rui.Zhang 1771 * @class 浏览器类 1772 * @description 提供一些与当前运行环境相关的函数 1773 */ 1774 browser : { 1775 1776 /** 1777 * @author Rui.Zhang 1778 * @description 获取当前浏览器平台内核 1779 * @returns {Object}, 该对象描述了一系列可能的浏览器内核,它包含以下属性:trident: IE内核, presto: opera内核, webKit: 苹果、谷歌内核, gecko: 火狐内核Gecko, mobile: 是否为移动终端, ios: ios ,android: android, iPhone: iPhone, iPad: iPad, webApp: Safari, weChat: 微信 1780 **/ 1781 version : function () { 1782 var u = navigator.userAgent; 1783 return { 1784 trident: u.indexOf('Trident') > -1, //IE内核 1785 presto: u.indexOf('Presto') > -1, //opera内核 1786 webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核 1787 gecko: u.indexOf('Firefox') > -1, //火狐内核Gecko 1788 mobile: !!u.match(/AppleWebKit.*Mobile.*/), //是否为移动终端 1789 ios: !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/), //ios 1790 android: u.indexOf('Android') > -1 || u.indexOf('Linux') > -1, //android 1791 iPhone: u.indexOf('iPhone') > -1 , //iPhone 1792 iPad: u.indexOf('iPad') > -1, //iPad 1793 webApp: u.indexOf('Safari') > -1, //Safari 1794 weChat: u.indexOf('MicroMessenger') > -1 //微信 1795 }; 1796 }, 1797 1798 1799 /** 1800 * @author Rui.Zhang 1801 * @description 获取URL中的请求参数,该函数已扩展到window/Mtils对象中 1802 * @param {String} [Url] 可选,带参数的URL, 默认为当前访问的URL 1803 * @returns {Object}, 序列化后的参数对象 array[param_Key] = param_value 1804 **/ 1805 getUrlParam : function (Url) { 1806 var result = new Object(); 1807 if(Url) { 1808 var tmp = Url.split("?")[1]; 1809 if(tmp) { 1810 tmp = tmp.split("&"); 1811 for(var j=0;j<tmp.length;j++) { 1812 result[tmp[j].split("=")[0]] = tmp[j].split("=")[1]; 1813 } 1814 } 1815 } else { 1816 var tmp = location.search.substring(1); 1817 if(tmp) { 1818 tmp = tmp.split("&"); 1819 for(var j=0;j<tmp.length;j++) { 1820 result[tmp[j].split("=")[0]] = tmp[j].split("=")[1]; 1821 } 1822 } 1823 } 1824 return result; 1825 }, 1826 1827 1828 /** 1829 * @author Rui.Zhang 1830 * @description 删除所有cookie 1831 * @returns {boolean}, true: 删除成功 1832 **/ 1833 delAllCookie : function () { 1834 try { 1835 var keys = document.cookie.match(/[^ =;]+(?=\=)/g); 1836 if (keys) { 1837 for (var i = 0; i < keys.length; i++) { 1838 document.cookie = keys[i] + '=null;path=/;expires=' + new Date(0).toGMTString(); 1839 } 1840 } 1841 } catch (ae) { 1842 return false; 1843 } 1844 return true; 1845 }, 1846 1847 1848 /** 1849 * @author Rui.Zhang 1850 * @description 删除cookie 1851 * @param {String} str_name 欲删除的cookie名称 1852 * @returns {boolean}, true: 删除成功 1853 **/ 1854 delCookie : function (str_name) { 1855 try { 1856 var exp = new Date(); 1857 exp.setTime(exp.getTime() - 10000); 1858 document.cookie = str_name + "=null;path=/;expires=" + exp.toGMTString() + ";"; 1859 } catch (ae) { 1860 return false; 1861 } 1862 return true; 1863 }, 1864 1865 1866 /** 1867 * @author Rui.Zhang 1868 * @description 设置cookie 1869 * @param {String} str_name 欲设置的cookie名称 1870 * @param {String} value cookie值 1871 * @param {String} [expires] 可选 , cookie过期时间,以分钟为单位 1872 * @returns {boolean}, true: 设置成功 1873 **/ 1874 setCookie : function (str_name, value, expires) { 1875 var exp = new Date(); 1876 try { 1877 exp.setTime(exp.getTime() + expires * 60 * 1000); 1878 if (expires) { 1879 document.cookie = str_name + "=" + decodeURIComponent(value) + ";path=/;expires=" + exp.toGMTString() + ";"; 1880 } else { 1881 document.cookie = str_name + "=" + decodeURIComponent(value) + ";path=/;"; 1882 } 1883 } catch (ae) { 1884 return false; 1885 } 1886 return true; 1887 }, 1888 1889 1890 /** 1891 * @author Rui.Zhang 1892 * @description 获取cookie值 1893 * @param {String} str_name 欲获取的cookie名称 1894 * @returns {String}, cookie值, null表示未找到 1895 **/ 1896 getCookie : function (str_name) { 1897 var arr = document.cookie.match(new RegExp("(^| )" + str_name + "=([^;]*)(;|$)")); 1898 if (arr != null) return decodeURI(arr[2]); 1899 return null; 1900 }, 1901 }, 1902 1903 1904 1905 /** 1906 * @author Rui.Zhang 1907 * @class 工具类 1908 * @description 提供一些辅助代码封装 1909 */ 1910 utils : { 1911 1912 /** 1913 * @author Rui.Zhang 1914 * @description 清除数组或者对象中的Empty属性,以下会被判断为Empty:空数组/空对象/null/undefined/NaN/'', 该函数已扩展到Mtils对象中 1915 * @param {Array|Object} param 欲清除的目标对象 1916 * @returns {any} result 已清除empty属性的对象 1917 **/ 1918 clearEmpty : function() { 1919 var target = arguments[0] || this, key, i, length, tmpArray = []; 1920 1921 if(!Mtils.isObject(target) && !Mtils.isArray(target)) return target; 1922 1923 if(Mtils.isObject(target)) { 1924 for(key in target) { 1925 if(Mtils.isEmpty(target[key])) { 1926 if(Reflect && Reflect.deleteProperty) { 1927 Reflect.deleteProperty(target, key); 1928 } else { 1929 delete target[key]; 1930 } 1931 } else if(Mtils.isObject(target) || Mtils.isArray(target)) { 1932 Mtils.utils.clearEmpty(target[key]) 1933 } 1934 1935 } 1936 } 1937 1938 if(Mtils.isArray(target)) { 1939 tmpArray = []; 1940 for(i=0,length=target.length; i<length; i++) { 1941 if(!Mtils.isEmpty(target[i])) tmpArray.push(target[i]); 1942 } 1943 target = tmpArray; 1944 } 1945 1946 return target; 1947 1948 }, 1949 1950 1951 /** 1952 * @author Rui.Zhang 1953 * @description 在数组中根据ID获取对象, 该函数已扩展到Mtils对象中 1954 * @param {string|number|array} id 欲获取的ID值 1955 * @param {array} arr 数据源 1956 * @param {string} key 如指定此参数则使用此参数为key进行查询 1957 * @returns {array} result 符合条件的返回结果集,如果传入的不是数组则返回结果集中的第一个元素 1958 **/ 1959 getById : function(search, key) { 1960 var result = [], arr = this, searchs = [], querys = [], key = key || "id", tmp; 1961 1962 if(Mtils.isEmpty(search)) return result[0]; 1963 1964 if(Mtils.isArray(search)) { 1965 searchs = searchs.concat(search); 1966 } else { 1967 searchs.push(search); 1968 } 1969 searchs.forEach(function(item) { 1970 tmp = {}; 1971 1972 if(Mtils.isObject(item) && item[key]) { 1973 tmp[key] = item[key]; 1974 querys.push(tmp); 1975 } 1976 if(Mtils.isString(item) || Mtils.isNumber(item)) { 1977 tmp[key] = item; 1978 querys.push(tmp); 1979 } 1980 }); 1981 result = Mtils.findInArray(querys, arr); 1982 if(!Mtils.isArray(search)) { 1983 return result [0]; 1984 } 1985 return result; 1986 }, 1987 1988 1989 /** 1990 * @author Rui.Zhang 1991 * @description 在数组中根据根据条件进行过滤, 该函数已扩展到Mtils对象中 1992 * @param {any} serch 查询条件,可以为字符串,也可以用数组一次查询多个 1993 * @param {array} arr 数据源 1994 * @param {boolean} regular 在匹配字符串时是否启用正则,启用正则后,查询条件中的值将转化为正则表达式 1995 * @returns {array} result 符合条件的返回结果集 1996 **/ 1997 findInArray : function(search, arr, regular) { 1998 var result = [], keys , reg, searchs = []; 1999 arr = arr || this; 2000 if(undefined === search) result = arr; 2001 if(!Array.isArray(arr)) return result; 2002 2003 if(Mtils.isArray(search)) { 2004 searchs = searchs.concat(search); 2005 } else { 2006 searchs.push(search); 2007 } 2008 2009 2010 searchs.forEach(function(search) { 2011 if(Mtils.isObject(search)) keys = Object.keys(search); 2012 2013 result = result.concat(arr.filter(function(item) { 2014 if(typeof(item) === typeof(search)) { 2015 if(Mtils.isString(search)) { 2016 if(true === regular) { 2017 reg = new RegExp(search); 2018 if(reg.test(item)) return true; 2019 } else { 2020 if(item === search) return true; 2021 } 2022 } else 2023 if(Mtils.isObject(search)) { 2024 if(keys.every(function(key) { 2025 if(true === regular && Mtils.isString(item[key]) && Mtils.isString(search[key])) { 2026 reg = new RegExp(search[key]); 2027 if(reg.test(item[key])) return true; 2028 } else { 2029 if(item[key] === search[key]) return true; 2030 } 2031 })) return true; 2032 } else 2033 if(item === search) return true; 2034 } 2035 })) 2036 }); 2037 return result; 2038 }, 2039 2040 2041 /** 2042 * @author Rui.Zhang 2043 * @description 判断变量是否定义, 该函数已扩展到Mtils/window对象中 2044 * @param {varName} varName 待判断的变量 2045 * @returns {boolean}, true/false 2046 **/ 2047 isDefined : function(varName) { 2048 return typeof varName !== 'undefined'; 2049 }, 2050 2051 2052 /** 2053 * @author Rui.Zhang 2054 * @description 保存数据到localStorage中,该函数已扩展到Mtils对象中 2055 * @param {string} key 存取键值, key值重复会导致数据覆盖, 如果参数2为对象, key值可以为该对象属性 2056 * @param {String} data 欲存取数据 2057 * @param {String} [objKey] 可选项, 当存取数据为对象时, 指定此选项后, 可以通过data[objKey]的值来存取数据 2058 * @returns {any} 2059 * @example 2060 * 1: Mtils.cache("Authorization", "uc43d452bdb373e4a36c3efc0f91c928d7"), 这里存入了一个名为'Authorization'的数据, 取回方式: Mtils.cache("Authorization") 2061 * 2: Mtils.cache("id", {id:235, name:'mr.zr', age:34}), 这里存入了一个对象, 取回方式如下: Mtils.cache(235) 或者 Mtils.cache("id") 2062 * 3: Mtils.cache("man", {id:235, name:'mr.zr', age:34}, "id"), 这里存入了一个对象, 取回方式如下: Mtils.cache(235) 或者 Mtils.cache("man") 2063 * 2064 **/ 2065 cache : function(key, data, obj_key) { 2066 if(key && data && arguments.length > 1) { 2067 var mtilsData = localStorage.mtilsData || '{}'; 2068 mtilsData = JSON.parse(mtilsData); 2069 2070 if(!obj_key && Mtils.utils.isObject(data) && data[key] && !mtilsData[data[key]]) { 2071 mtilsData[data[key]] = data; 2072 } else if(obj_key) { 2073 mtilsData[data[obj_key]] = data; 2074 } 2075 mtilsData[key] = data; 2076 2077 localStorage.mtilsData = JSON.stringify(mtilsData); 2078 } else { 2079 var mtilsData = localStorage.mtilsData || '{}'; 2080 mtilsData = JSON.parse(mtilsData); 2081 return mtilsData[key]; 2082 } 2083 }, 2084 2085 2086 /** 2087 * @author Rui.Zhang 2088 * @description 深复制, 该函数已扩展到Mtils对象上 2089 * @param {any} varName 待复制的数据 2090 * @returns {any}, 返回深复制的新对象 2091 **/ 2092 copy : function(obj) { 2093 return JSON.parse(JSON.stringify(obj)); 2094 }, 2095 2096 2097 /** 2098 * @author Rui.Zhang 2099 * @description 简单版本的链式语法函数调用,该函数已扩展到Window/Mtils对象中 2100 * @param {none} 无参数 2101 * @returns {none}, 无返回值 2102 * @example 此方案简单解决回调的解决方案,使用如下: 2103 * 2104 * ChainCallManager() 返回一个链式调用对象,可以调用.then(fn)来注册需要调用的函数 2105 * 当函数注册完毕后,调用.start()或.run(),方法启动函数链的调用 2106 * .start()该函数需要你在函数中使用this.next()或this.callNext()方法来手动调用下一个函数,适用于函数之间有先后顺序的调用.比如异步且有顺序,.next()/.callNext()可以传递参数给下一个函数 2107 * .run()函数则系统自动按注册顺序调用调用,适合于函数之间没有关联的调用.比如:函数中有异步请求,则系统不会消耗时间等待异步请求返回.会在发送异步请求后直接调用下一个函数 2108 * ChainCallManager().then(function(params) { 2109 * console.log('this is one function', params); 2110 * this.next('call function2'); //请注意,如果这里不调用.next(),函数调用将在这里终止,.next()函数中的参数将会传递给下一个函数 2111 * }).then(function(params) { 2112 * console.log('this is two function', params); 2113 * }).start('start'); //携带启动参数 start 2114 * 2115 * 上面将会依次输出: 2116 * line1: this is one function start 2117 * line2: this is two function call function2 2118 * 2119 * 2120 * ChainCallManager().then(function(params) { 2121 * console.log('this is one function', params); 2122 * return 'call funtcion2'; //这里的返回值将会传递给下一个函数 2123 * }).then(function(params) { 2124 * console.log('this is two function', params); 2125 * }).run('start'); //携带启动参数 start 2126 * 2127 * 2128 * 上面将会依次输出: 2129 * line1: this is one function start 2130 * line2: this is two function call funtcion2 2131 * 2132 **/ 2133 ChainCallManager : function () { 2134 var fn = function() { 2135 this.methodsRunIndex = 0; 2136 this.methods = []; 2137 this.autoCall = false; 2138 2139 2140 this.next = this.callNext = function(params) { 2141 if(!this.autoCall) { 2142 this.methodsRunIndex ++; 2143 if(this.methods[this.methodsRunIndex]) { 2144 this.methods[this.methodsRunIndex].call(this, params); 2145 } 2146 } 2147 return this; 2148 }; 2149 2150 this.then = function(fn) { 2151 if(fn && "function" === typeof(fn)) { 2152 this.methods.push(fn); 2153 } 2154 return this; 2155 }; 2156 2157 this.start = function(params) { 2158 this.autoCall = false; 2159 2160 this.methods[this.methodsRunIndex].call(this, params); 2161 }; 2162 2163 this.run = function(params) { 2164 var preResult = params || undefined; 2165 2166 this.autoCall = true; 2167 2168 for(var i=0; i<this.methods.length; i++) { 2169 this.methodsRunIndex = i; 2170 2171 preResult = this.methods[this.methodsRunIndex].call(this, preResult); 2172 } 2173 }; 2174 }; 2175 2176 return new fn(); 2177 }, 2178 2179 2180 /** 2181 * @author Rui.Zhang 2182 * @description 用字符串创建map, 该函数已扩展到Mtils对象中 2183 * @param {string} keys 主键字符串,使用','分隔多个key, 例如'key1, key2,...' 2184 * @param {any} defaultVal 创建对象时使用的默认值 2185 * @returns {object}, 返回创建完成的对象 2186 * @example Mtils.utils.makeMap('id,name,sex'); 返回值: {id:true, name:true, sex:true} 2187 **/ 2188 makeMap : function(str, defaultVal) { 2189 var obj = {}, items = Mtils.extention.trim(str).split(","), i; 2190 for (i = 0; i < items.length; i++) 2191 obj[ items[i] ] = defaultVal; 2192 return obj; 2193 }, 2194 2195 2196 /** 2197 * @author Rui.Zhang 2198 * @description 获取变量的数据类型, 推荐使用Mtils.extention下的数据类型校验方法 2199 * @param {varName} varName 待取数据类型的变量 2200 * @returns {string}, 变量的数据类型,可能能为以下类型object,array,number,string,function,date,null,undefined 2201 **/ 2202 getVarType : function(varName) { 2203 return Object.prototype.toString.call(varName); 2204 }, 2205 2206 2207 /** 2208 * @author Rui.Zhang 2209 * @description 判断变量是否为空值,请注意以下对象会被判断为空值:空数组/空对象/null/undefined/NaN/'', 该函数已扩展到Mtils/Window对象中 2210 * @param {varName} varName 待判断数据类型的变量 2211 * @returns {boolean}, true/false 2212 **/ 2213 isEmpty : function(varName) { 2214 if(varName === undefined) return true; 2215 if(varName === null) return true; 2216 if(Mtils.isNaN(varName)) return true; 2217 if(Mtils.isString(varName) && 0 === varName.length) return true; 2218 if(Mtils.isArray(varName) && 0 === varName.length) return true; 2219 if(Mtils.isObject(varName) && 0 === Object.keys(varName).length) return true; 2220 2221 return false; 2222 }, 2223 2224 2225 /** 2226 * @author Rui.Zhang 2227 * @description 根据对象属性在数组中抽取所有该对象属性的值组成新数组返回 2228 * @param {array} sourceArr 待查找的数组 2229 * @param {string} properties 要获取的字段 2230 * @param {string} defaultVal 默认值 2231 * @returns {Array}, 指定属性的集合 2232 **/ 2233 extractPropertyValuesInArray : function(sourceArr ,properties, defaultVal) { 2234 var result = []; 2235 2236 if(sourceArr && Array.isArray(sourceArr)) { 2237 for(var i= 0, item; i<sourceArr.length; i ++) { 2238 item = sourceArr[i]; 2239 if(properties && "object" == typeof(item)) { 2240 if(item[properties]) { 2241 result.push(item[properties]); 2242 } else if(undefined != defaultVal) { 2243 result.push(defaultVal); 2244 } 2245 } else { 2246 if(item) { 2247 result.push(String(item)); 2248 }else if(undefined != defaultVal) { 2249 result.push(defaultVal); 2250 } 2251 } 2252 } 2253 } 2254 return result; 2255 }, 2256 2257 2258 /** 2259 * @author Rui.Zhang 2260 * @description 提供进制转换,最大为64进制 2261 * @param {String} number 待转换进制序列 2262 * @param {number} from 待转换进制(2-64) 2263 * @param {number} to 转换到进制(2-64) 2264 * @returns {String}, 转换后的进制序列 2265 * @example 把16进制0x7b转为2进制, Mtils.utils.decimalConversion("7b",16,2); 2266 **/ 2267 decimalConversion : function(number, from, to) { 2268 var origin = Mtils.constant.BASE_DECIMAL, tmp, decimal = 0, result = ""; 2269 if(undefined == number || !String(number).replace(/ /gi,"")) return ""; 2270 if(!from) return ""; 2271 2272 try { 2273 if(from) 2274 from = Number(from); 2275 if(to) 2276 to = Number(to); 2277 2278 //先将其转换为10进制 2279 tmp = String(number); 2280 for(var i=0, j=1;i<tmp.length; i++, j++) { 2281 decimal += origin.indexOf(tmp.charAt(i)) * Math.pow(from, tmp.length - j); 2282 } 2283 if(to == '10' || !to) return decimal; 2284 2285 //再转换为指定进制 2286 while(decimal != 0) { 2287 tmp = decimal % to; 2288 result = origin.charAt(tmp) + result; 2289 decimal = (decimal - tmp) / to; 2290 } 2291 return result; 2292 } catch(e) { 2293 console.log(e); 2294 return ""; 2295 } 2296 }, 2297 2298 2299 /** 2300 * @author Rui.Zhang 2301 * @description 获取汉字拼音或首字母 2302 * @param {String} str 待获取拼音的字符串,除汉字外其余字符会直接返回 2303 * @param {Boolean} extractFirst 只获取汉字拼音首字母 2304 * @returns {String} 目标的拼音字符串 2305 **/ 2306 makePy : function (str, extractFirst) { 2307 var i, tmp, key, result = '', flag, firstChar, PYMaps; 2308 2309 extractFirst = extractFirst || false; 2310 PYMaps = Mtils.constant.PY_MAPS; 2311 2312 for(i=0; i<str.length; i++) { 2313 tmp = str.substr(i, 1); 2314 flag = false; 2315 for (key in PYMaps){ 2316 if (Mtils.extention.isString(PYMaps[key]) && PYMaps[key].indexOf(tmp) != -1) { 2317 firstChar = key.substr(0, 1).toUpperCase(); 2318 2319 if(true == extractFirst) { 2320 result += firstChar; 2321 } else { 2322 result += firstChar + key.substr(1, key.length).toLowerCase(); 2323 } 2324 2325 flag = true; 2326 break; 2327 } 2328 } 2329 if(!flag ) { 2330 result += tmp; 2331 } 2332 } 2333 return result; 2334 }, 2335 2336 2337 /** 2338 * @author Rui.Zhang 2339 * @description 计算年龄 2340 * @param {Date} birth 待设置的对象 2341 * @param {Date} now 待设置属性名称 2342 * @returns {Int} 计算出的年龄 2343 **/ 2344 calcAge : function(birth, now) { 2345 now = now || new Date(); 2346 if(birth && now) { 2347 try { 2348 var birth, now, age; 2349 if("string" === typeof (birth) || "number" === typeof (now)) { 2350 birth = new Date(birth); 2351 } 2352 if("string" === typeof (now) || "number" === typeof (now)) { 2353 now = new Date(now); 2354 } 2355 2356 age = now.getFullYear() - birth.getFullYear(); 2357 if(0 >= age) { 2358 age = 0; 2359 } else if(0 < age) { 2360 if(birth.getMonth() == now.getMonth()) { 2361 if(birth.getDate() > now.getDate()) { 2362 age --; 2363 } 2364 } else if(birth.getMonth() >= now.getMonth()) { 2365 age --; 2366 } 2367 } 2368 return age + ""; 2369 } catch(e) { 2370 console.log("Invalid Date, please input like '1992-08-12' or '1992/12/12'"); 2371 return ""; 2372 } 2373 } 2374 return ""; 2375 }, 2376 2377 2378 /** 2379 * @author Rui.Zhang 2380 * @description 设置对象属性值 2381 * @param {String} obj 待设置的对象 2382 * @param {String} propName 待设置属性名称 2383 * @param {String} defaultVal 待设置属性的值 2384 * @param {String} isCreate 如没有该属性是否创建,默认不创建 2385 * @returns {Void} 2386 **/ 2387 setObjectPropertyVal : function (obj, propName, propVal, isCreate) { 2388 if(obj && propName ) { 2389 if(propName.length > 0 && "object" == typeof obj) { 2390 var props = propName.split("."), varStr = "obj"; 2391 for(var i= 0, attr;i<props.length;i++) { 2392 attr = props[i]; 2393 varStr += "." + attr ; 2394 2395 if(isCreate) { 2396 try { 2397 if(undefined == eval(varStr)) { 2398 eval(varStr + "={}"); 2399 } 2400 } catch(e) { 2401 console.log(e) 2402 } 2403 } 2404 } 2405 varStr += "=propVal"; 2406 2407 try { 2408 eval(varStr); 2409 } catch(e) { 2410 console.log(e) 2411 } 2412 } else { 2413 console.log("obj is not object or propName not value"); 2414 } 2415 } else { 2416 console.log("params error"); 2417 } 2418 }, 2419 2420 2421 /** 2422 * @author Rui.Zhang 2423 * @description 获取对象属性值 2424 * @param {String} obj 待获取长度的数据 2425 * @param {String} propName 待获取属性名称 2426 * @param {String} defaultVal 待获取属性未定义则返回此值 2427 * @returns {Any}, 获取的属性值 2428 **/ 2429 getObjectPropertyVal : function (obj, propName, defaultVal) { 2430 if(obj && propName ) { 2431 if(propName.length > 0 && "object" == typeof obj) { 2432 var props = propName.split("."), varStr = "obj"; 2433 for(var i=0;i<props.length;i++) { 2434 varStr += "." + props[i]; 2435 2436 if(null != defaultVal || undefined != defaultVal) { 2437 try { 2438 if(undefined == eval(varStr)) { 2439 return defaultVal; 2440 } 2441 } catch(e) { 2442 console.log(e) 2443 } 2444 } 2445 } 2446 2447 try { 2448 var tmp = eval(varStr); 2449 if(null == tmp || undefined == tmp) { 2450 return defaultVal; 2451 } else { 2452 return tmp; 2453 } 2454 } catch(e) { 2455 console.log(e) 2456 } 2457 } else { 2458 console.log("obj is not object or propName not value"); 2459 } 2460 } else { 2461 console.log("params error"); 2462 } 2463 }, 2464 2465 2466 /** 2467 * @author Rui.Zhang 2468 * @description 获取字符串的字节长度 2469 * @param {String} str_data 待获取长度的数据 2470 * @returns {Long}, 字符串长度 2471 **/ 2472 getByteLength : function(str_data) { 2473 str_data = str_data || String(this); 2474 if(Mtils.utils.isString(str_data)) { 2475 var Zhlength = 0;// 全角 2476 var Enlength = 0;// 半角 2477 if(str_data) { 2478 for (var i = 0; i < str_data.length; i++) { 2479 if (str_data.substring(i, i + 1).match(/[^\x00-\xff]/ig) != null) 2480 Zhlength += 1; 2481 else 2482 Enlength += 1; 2483 } 2484 } 2485 // 返回当前字符串字节长度 2486 return (Zhlength * 2) + Enlength; //所占字节数 2487 } 2488 return 0; 2489 }, 2490 2491 2492 /** 2493 * @author Rui.Zhang 2494 * @description 格式化金额, 展示位银行金额格式 2495 * @param {Long} long_data 待格式化数值 2496 * @param {Integer} [length] 可选,格式化金额精度, 即小数点位数. 如: 3 标示保留小数点后三位, 默认为2位 2497 * @returns {String}, 格式化后金额 2498 **/ 2499 formatMoney : function (long_data, length) { 2500 length = length > 0 && length <= 20 ? length : 2; 2501 long_data = parseFloat((long_data + "").replace(/[^\d\.-]/g, "")).toFixed(length) + ""; 2502 var l = long_data.split(".")[0].split("").reverse(), 2503 r = long_data.split(".")[1]; 2504 t = ""; 2505 for(i = 0; i < l.length; i ++ ) 2506 { 2507 t += l[i] + ((i + 1) % 3 == 0 && (i + 1) != l.length ? "," : ""); 2508 } 2509 return t.split("").reverse().join("") + "." + r; 2510 }, 2511 2512 2513 /** 2514 * @author Rui.Zhang 2515 * @description 文本简介, 即截取字符串前几个字符 2516 * @param {String} str_data 待截取文本 2517 * @param {Integer} length 待截取长度 2518 * @returns {String}, 文本简介 2519 **/ 2520 strIntro : function (str_data, length) { 2521 if (str_data.length > length) { 2522 return str_data.substr(0, length) + "..."; 2523 } else { 2524 return str_data; 2525 } 2526 }, 2527 2528 } 2529 }; 2530 2531 2532 2533 2534 window.ChainCallManager = Mtils.ChainCallManager = Mtils.utils.ChainCallManager; 2535 window.isDefined = Mtils.isDefined = Mtils.utils.isDefined; 2536 window.isEmpty = Mtils.isEmpty = Mtils.utils.isEmpty; 2537 window.strToJson = Mtils.strToJson = Mtils.extention.strToJson; 2538 2539 Mtils.copy = Mtils.utils.copy; 2540 Mtils.cache = Mtils.utils.cache; 2541 Mtils.makeMap = Mtils.utils.makeMap; 2542 Mtils.extend = Mtils.extention.extend; 2543 2544 Mtils.findInArray = Mtils.utils.findInArray; 2545 Mtils.getById = Mtils.utils.getById; 2546 2547 Mtils.isObject = Mtils.extention.isObject; 2548 Mtils.isArray = Mtils.extention.isArray; 2549 Mtils.isNaN = Mtils.extention.isNaN; 2550 Mtils.isString = Mtils.extention.isString; 2551 Mtils.isDate = Mtils.extention.isDate; 2552 Mtils.isFunction = Mtils.extention.isFunction; 2553 Mtils.isNumber = Mtils.extention.isNumber; 2554 Mtils.isWindow = Mtils.extention.isWindow; 2555 Mtils.isFile = Mtils.extention.isFile; 2556 Mtils.isFormData = Mtils.extention.isFormData; 2557 Mtils.isRegExp = Mtils.extention.isRegExp; 2558 Mtils.unique = Mtils.extention.uniqueArray; 2559 Mtils.includes = Mtils.extention.includes; 2560 Mtils.clearEmpty = Mtils.utils.clearEmpty; 2561 Mtils.uuid = Mtils.security.uuid; 2562 2563 2564 if(!Mtils.isEmpty(Math)) Math.accAdd = Mtils.extention.accAdd; 2565 if(!Mtils.isEmpty(Math)) Math.accSub = Mtils.extention.accSub; 2566 if(!Mtils.isEmpty(Math)) Math.accMul = Mtils.extention.accMul; 2567 if(!Mtils.isEmpty(Math)) Math.accDiv = Mtils.extention.accDiv; 2568 2569 if(Mtils.isEmpty(Date.prototype.formatDate)) Date.prototype.formatDate = Date.prototype.format = Mtils.extention.formatDate; 2570 if(Mtils.isEmpty(Date.prototype.now)) Date.prototype.now = Mtils.now = Mtils.extention.now; 2571 2572 if(Mtils.isEmpty(String.prototype.rtrim)) String.prototype.rtrim = Mtils.extention.rtrim; 2573 if(Mtils.isEmpty(String.prototype.ltrim)) String.prototype.ltrim = Mtils.extention.ltrim; 2574 if(Mtils.isEmpty(String.prototype.atrim)) String.prototype.atrim = Mtils.extention.atrim; 2575 if(Mtils.isEmpty(String.prototype.replaceAll)) String.prototype.replaceAll = Mtils.extention.replaceAll; 2576 if(Mtils.isEmpty(String.prototype.includes)) String.prototype.includes = Mtils.extention.includes; 2577 2578 2579