js | 您所在的位置:网站首页 › js压缩json字符串 › js |
JS压缩字符串
最近项目中使用到了压缩字符串的功能,在网上查阅了很多,也有很多处理方式。有引入js库的,也有原生的方式完成的。压缩完成后的字符串乱码,如果不想要乱码的字符串可以不用查看了。 引入js库实现使用lz-string.js文件 引入 使用 var string = "Lorem Ipsum is simply dummy text of the printing and typesetting industry."; console.log("Size of sample is: " + string.length); var compressed = LZString.compress(string); console.log("Size of compressed sample is: " + compressed.length); console.log(compressed); string = LZString.decompress(compressed); console.log("Sample is: " + string);打印效果 主要实现方式:压缩(LZString.compress),解压缩(LZString.decompress) js原生实现直接上代码 /** * 压缩字符串 */ function compress(strNormalString) { var strCompressedString = ""; var ht = new Array(); for (i = 0; i < 128; i++) { ht[i] = i; } var used = 128; var intLeftOver = 0; var intOutputCode = 0; var pcode = 0; var ccode = 0; var k = 0; for (var i = 0; i < strNormalString.length; i++) { ccode = strNormalString.charCodeAt(i); k = (pcode (intLeftOver - 16)); intOutputCode &= (Math.pow(2, (intLeftOver - 16)) - 1); intLeftOver -= 16; } if (used < 4096) { used++; ht[k] = used - 1; } } } if (pcode != 0) { intLeftOver += 12; intOutputCode > (intLeftOver - 16)); intOutputCode &= (Math.pow(2, (intLeftOver - 16)) - 1); intLeftOver -= 16; } if (intLeftOver > 0) { intOutputCode 128) { ht[ht.length] = ht[pcode] + key.substr(0, 1); } pcode = ccode; } else { key = ht[pcode] + ht[pcode].substr(0, 1); strNormalString += key; ht[ht.length] = ht[pcode] + key.substr(0, 1); pcode = ht.length - 1; } used++; intLeftOver -= 12; intOutputCode &= (Math.pow(2, intLeftOver) - 1); } else { break; } } } return strNormalString; }效果图片如下 实现压缩中文字符串以上两种方式不能实现压缩中文字符串,所以我最开始想的是将中文字符串转换成拼音,然后压缩,在想想拼音解压回来可能不正确。所以我最后选择的方式是将中文转换成16进制,将16进制压缩,然后解压转换 转换16进制方法如下 function chToHex(ch) { //汉字字符转16进制 if (ch) { var arr = ch.split('') var res = '' for (var i = 0; i < arr.length; i++) { res += arr[i].charCodeAt().toString(16) if (i != arr.length - 1) { res += ',' } } console.log(res) // 5468,516d return res } return false } function hexToCh(ch) { //16进制转汉字 if (ch) { var arr = ch.split(',') var res = '' for (var i = 0; i < arr.length; i++) { res += String.fromCharCode(parseInt(arr[i], 16)) } console.log(res) // 周六 return res } return false }具体实现的一个小demo 压缩字符串方法 cesfafsfadsfas 点击修改数据 点击还原数据 // 外部jar包引用 var string = "Lorem Ipsum is simply dummy text of the printing and typesetting industry."; console.log("Size of sample is: " + string.length); var compressed = LZString.compress(string); console.log("Size of compressed sample is: " + compressed.length); console.log(compressed); string = LZString.decompress(compressed); console.log("Sample is: " + string); let isChange = 0 function changeText() { if (isChange === 0) { let text = document.getElementById('spanText').innerText let newText = chToHex(text) let changeText = compress(newText) document.getElementById('spanText').innerText = changeText isChange = 1 } else { alert('当前展示文本已经压缩,请解压后操作') return false } } function reductionText() { if (isChange === 1) { let text = document.getElementById('spanText').innerText console.log('原始数据', text) let reductionText = decompress(text) console.log('解压完成数据', reductionText) let reg = new RegExp("[\\u4E00-\\u9FFF]+", "g") if (reg.test(reductionText)) { console.log('包含中文') } let newText = hexToCh(reductionText) document.getElementById('spanText').innerText = newText isChange = 0 } else { alert('当前展示文本还未压缩,请压缩后操作') return false } } /** * 压缩字符串 */ function compress(strNormalString) { var strCompressedString = ""; var ht = new Array(); for (i = 0; i < 128; i++) { ht[i] = i; } var used = 128; var intLeftOver = 0; var intOutputCode = 0; var pcode = 0; var ccode = 0; var k = 0; for (var i = 0; i < strNormalString.length; i++) { ccode = strNormalString.charCodeAt(i); k = (pcode (intLeftOver - 16)); intOutputCode &= (Math.pow(2, (intLeftOver - 16)) - 1); intLeftOver -= 16; } if (used < 4096) { used++; ht[k] = used - 1; } } } if (pcode != 0) { intLeftOver += 12; intOutputCode > (intLeftOver - 16)); intOutputCode &= (Math.pow(2, (intLeftOver - 16)) - 1); intLeftOver -= 16; } if (intLeftOver > 0) { intOutputCode 128) { ht[ht.length] = ht[pcode] + key.substr(0, 1); } pcode = ccode; } else { key = ht[pcode] + ht[pcode].substr(0, 1); strNormalString += key; ht[ht.length] = ht[pcode] + key.substr(0, 1); pcode = ht.length - 1; } used++; intLeftOver -= 12; intOutputCode &= (Math.pow(2, intLeftOver) - 1); } else { break; } } } return strNormalString; } chToHex() hexToCh() function chToHex(ch) { //汉字字符转16进制 if (ch) { var arr = ch.split('') var res = '' for (var i = 0; i < arr.length; i++) { res += arr[i].charCodeAt().toString(16) if (i != arr.length - 1) { res += ',' } } console.log(res) // 5468,516d return res } return false } function hexToCh(ch) { //16进制转汉字 if (ch) { var arr = ch.split(',') var res = '' for (var i = 0; i < arr.length; i++) { res += String.fromCharCode(parseInt(arr[i], 16)) } console.log(res) // 周六 return res } return false }展示效果 参考博客: 十六进制转换:https://blog.csdn.net/weixin_43939111/article/details/114830133 字符串压缩:https://blog.csdn.net/qq285679784/article/details/126996720 |
CopyRight 2018-2019 实验室设备网 版权所有 |