转义\u200b(零宽度空间)和其他非法JavaScript字符
我将一组JavaScript对象引导到后端模板,以在页面加载时初始化Backbone.js集合。它看起来像这样(作为细枝模板):转义\u200b(零宽度空间)和其他非法JavaScript字符,javascript,escaping,Javascript,Escaping,我将一组JavaScript对象引导到后端模板,以在页面加载时初始化Backbone.js集合。它看起来像这样(作为细枝模板): (功能(){ var jobCollection=new App.Collections.Item( {items%%中的项的%s} { 名称:“{item.name}}”, ... }, {%endfor%} ); })(); 我遇到的问题是,一些文本字段包含\u200b(零宽度空间),这会破坏JavaScript 逃离这些角色的最佳方式是什么?我应该在后端转义
(功能(){
var jobCollection=new App.Collections.Item(
{items%%中的项的%s}
{
名称:“{item.name}}”,
...
},
{%endfor%}
);
})();
我遇到的问题是,一些文本字段包含\u200b(零宽度空间),这会破坏JavaScript
逃离这些角色的最佳方式是什么?我应该在后端转义它们(我使用Symfony 2和Twig来呈现初始模板),还是应该在客户端使用JavaScript转义它们?如何在JavaScript或PHP中转义零宽度空格字符和其他字符?如果该字符仅出现在字符串中,或者转义为
\u200b
或者转义为文字,则应该可以。它们只是作为标识符是非法的。即使作为标识符,如果使用下标符号(obj[“aaa\u200b”]=“foo”
),也可以将它们用作对象属性名;至少在Chrome中是这样,但我不确定这是否安全/兼容
看几个似乎有效的例子:
var escaped = "aaa \u200b bbb";
var unescaped = "bbb ccc";
console.log(escaped.charCodeAt(4));
console.log(unescaped.charCodeAt(4));
var obj = {};
obj[escaped] = "foo";
obj[unescaped] = "bar";
console.log(obj[escaped]);
console.log(obj[unescaped]);
console.log(obj["aaa \u200b bbb"]);
console.log(obj["bbb ccc"]);
您可能还对我不久前写的这个Q/A感兴趣:谢谢gerate的回答!我发现我为
name
设置的字符串中也有一个换行符,紧接着是Escape\u200b导致了错误。所以我实际上必须为换行符而逃跑,而不是你在答案中解释的逃跑字符。有道理,很高兴你能找到它!
var escaped = "aaa \u200b bbb";
var unescaped = "bbb ccc";
console.log(escaped.charCodeAt(4));
console.log(unescaped.charCodeAt(4));
var obj = {};
obj[escaped] = "foo";
obj[unescaped] = "bar";
console.log(obj[escaped]);
console.log(obj[unescaped]);
console.log(obj["aaa \u200b bbb"]);
console.log(obj["bbb ccc"]);