json-decode.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /**
  2. * 此方法用于将Json内容的Unicode编解码
  3. * @param {Object} text
  4. */
  5. window.JsonEnDecode = {
  6. uniEncode: function (str) {
  7. return escape(str)
  8. .replace(/%u/gi, '\\u')
  9. .replace(/%7b/gi, '{')
  10. .replace(/%7d/gi, '}')
  11. .replace(/%3a/gi, ':')
  12. .replace(/%2c/gi, ',')
  13. .replace(/%27/gi, '\'')
  14. .replace(/%22/gi, '"')
  15. .replace(/%5b/gi, '[')
  16. .replace(/%5d/gi, ']')
  17. .replace(/%3D/gi, '=')
  18. .replace(/%08/gi, '\b')
  19. .replace(/%0D/gi, '\r')
  20. .replace(/%0C/gi, '\f')
  21. .replace(/%09/gi, '\t')
  22. .replace(/%20/gi, ' ')
  23. .replace(/%0A/gi, '\n')
  24. .replace(/%3E/gi, '>')
  25. .replace(/%3C/gi, '<')
  26. .replace(/%3F/gi, '?');
  27. },
  28. uniDecode: function (text) {
  29. text = text.replace(/(\\)?\\u/gi, "%u").replace('%u0025', '%25');
  30. text = unescape(text.toString().replace(/%2B/g, "+"));
  31. let matches = text.match(/(%u00([0-9A-F]{2}))/gi);
  32. if (matches) {
  33. for (let matchid = 0; matchid < matches.length; matchid++) {
  34. let code = matches[matchid].substring(1, 3);
  35. let x = Number("0x" + code);
  36. if (x >= 128) {
  37. text = text.replace(matches[matchid], code);
  38. }
  39. }
  40. }
  41. text = unescape(text.toString().replace(/%2B/g, "+"));
  42. return text;
  43. },
  44. urlDecode: function (str) {
  45. try {
  46. return decodeURIComponent(str);
  47. } catch (e) {
  48. return str;
  49. }
  50. },
  51. // 此种模式,随便用
  52. urlDecodeByFetch: function (str) {
  53. return new Promise((resolve, reject) => {
  54. try {
  55. fetch(`data:text/javascript;charset=utf8,${str.replace(/"/g, '%22').replace(/#/g, '%23')}`)
  56. .then(res => res.text(), error => {
  57. reject && reject(error);
  58. })
  59. .then(text => {
  60. resolve && resolve(text);
  61. });
  62. } catch (e) {
  63. resolve && resolve(str);
  64. }
  65. });
  66. },
  67. // 此种形式需要在manifest中增加csp策略,暂且不用
  68. urlDecodeByIframe: function (str, charset) {
  69. charset = charset || 'utf8';
  70. return new Promise((resolve, reject) => {
  71. let iframe = document.querySelector('#_urlDecode_iframe_');
  72. if (iframe) {
  73. iframe.remove();
  74. }
  75. iframe = document.createElement('iframe');
  76. iframe.setAttribute('id', '_urlDecode_iframe_');
  77. iframe.style.display = 'none';
  78. iframe.width = "0";
  79. iframe.height = "0";
  80. iframe.scrolling = "no";
  81. iframe.allowtransparency = "true";
  82. iframe.frameborder = "0";
  83. iframe.src = 'about:blank';
  84. document.body.appendChild(iframe);
  85. window._urlDecodeCallback = window._urlDecodeCallback || function (e) {
  86. resolve && resolve(e.data);
  87. iframe.remove();
  88. };
  89. window.removeEventListener('message', window._urlDecodeCallback);
  90. window.addEventListener('message', window._urlDecodeCallback, false);
  91. try {
  92. iframe.contentWindow.document.write('<html><scrip' + `t charset="${charset}" src="data:text/javascript;charset=${charset},parent.postMessage(\`${str.replace(/"/g, '%22').replace(/#/g, '%23')}\`)"></scrip` + 't></html>');
  93. } catch (e) {
  94. reject && reject(e);
  95. }
  96. });
  97. }
  98. };