利用 Unicode 零宽字符隐藏 JavaScript 代码的技巧
本文介绍利用 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 和零宽字符隐藏代码的相关技巧分享,希望能为读者提供有益的参考与启发。
JS读取本地文件时报错或无响应的常见原因
2026-11-05 16:32:31
let、const与var的区别:JavaScript变量声明最佳实践
2026-11-05 14:16:38
JS中直接定义静态二维数组的字面量写法
2026-11-05 14:16:08
JS 怎么查找字符串中所有匹配项的位置
2026-11-05 14:15:53
JavaScript新手常犯的编码错误与最佳实践指南
2026-11-04 22:12:38
