利用 Unicode 零宽字符隐藏 JavaScript 代码的技巧

作者:青柠

时间:2026-10-22

浏览:621

本文介绍利用 Unicode 零宽字符(如 U+200B 等)在 JavaScript 中隐藏代码的技术。通过映射二进制数据到不可见字符,实现视觉上的代码隐藏。文章提供了基础实现思路、代码示例及生成工具的使用说明,并探讨了其在面试题或趣味编程中的应用,同时指出该方法可能导致数据膨胀的问题。

文章目录

零宽字符隐藏代码原理

此前在技术交流群中,有用户分享了一篇题为《“短”化你的代码》的文章,其核心思路令人耳目一新。该方法利用 Unicode 中的零宽字符(Zero-Width Characters)来实现信息的视觉隐藏。尽管这些字符在底层存在,但在常规显示环境下用户无法直接看到它们。文章详细解析了该技术的实现原理,并附带提供了一个用于生成此类隐藏内容的工具。

作者在文末留下了一个值得思考的练习:由于最初仅使用了两个零宽字符进行编码,导致转换后的数据体积膨胀至原始数据的 8 倍。如果将使用的零宽字符数量增加至 4 个,理论上可以将数据膨胀率降低至 4 倍,从而优化存储效率。

接下来,我们直接通过代码示例来观察这一技术的具体实现方式。

代码实现与生成机制


(function(window) {
 var rep = { // 替换用的数据,使用了4个零宽字符,数据量减少了一半。
  '00': '\u200b',
  '01': '\u200c',
  '10': '\u200d',
  '11': '\uFEFF'
 };
 function hide(str) {
  str = str.replace(/[^\x00-\xff]/g, function(a) { // 转码 Latin-1 编码以外的字符。
   return escape(a).replace('%', '\\');
  });
  str = str.replace(/[\s\S]/g, function(a) { // 处理二进制数据并且进行数据替换
   a = a.charCodeAt().toString(2);
   a = a.length < 8 ? Array(9 - a.length).join('0') + a : a;
   return a.replace(/../g, function(a) {
    return rep[a];
   });
  });
  return str;
 }
 var tpl = '("@code".replace(/.{4}/g,function(a){var rep={"\u200b":"00","\u200c":"01","\u200d":"10","\uFEFF":"11"};return String.fromCharCode(parseInt(a.replace(/./g, function(a) {return rep[a]}),2))}))';
 window.hider = function(code, type) {
  var str = hide(code); // 生成零宽字符串
  str = tpl.replace('@code', str); // 生成模版
  if (type === 'eval') {
   str = 'eval' + str;
  } else {
   str = 'Function' + str + '()';
  }
  return str;
 }
})(window);

读者可以通过简单的代码片段进行测试,验证其隐藏效果,也可以在此基础上进一步优化逻辑,甚至将其封装为插件。这既是一个不错的编程练习,虽然该技术在生产环境中缺乏实际业务价值,但作为技术探索或趣味项目仍具一定意义。此外,由于其反直觉的特性,偶尔也可用作面试题来考察候选人的底层知识储备。

以上便是关于利用 JavaScript 和零宽字符隐藏代码的相关技巧分享,希望能为读者提供有益的参考与启发。

实用工具推荐

电子包浆

绿化、压缩、噪点和虚拟水印,自由调节做旧程度。

使用 ›
图片压缩

选择画质和输出格式,预览压缩前后的大小。

使用 ›
相关文章