Escape \ u200b(零宽度空间)和其他非法JavaScript字符

时间:2013-01-29 13:32:38

标签: javascript escaping

我有一组JavaScript对象,我引导到后端模板,以在页面加载时初始化我的Backbone.js集合。它看起来像这样(作为Twig模板):

<script type="text/javascript">
(function() {
    var jobCollection = new App.Collections.Item(
        {% for item in items %}
        {
            name: '{{ item.name }}',
            ...
        },
        {% endfor %}
    );
})();
</script>

我遇到的问题是某些文本字段包含打破JavaScript的\ u200b(零宽度空间)。

逃避这些角色的最佳方法是什么?我应该在后端逃避它们(我使用带有Twig的Symfony 2来渲染初始模板)还是应该使用JavaScript在客户端上将它们转义?如何在JavaScript或PHP中转义零宽度空格字符和其他字符?

1 个答案:

答案 0 :(得分:2)

如果角色只出现在字符串中,可以转义为\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"]);

http://codepen.io/anon/pen/JqjEK

你可能也对我前一段时间写的这个Q / A感兴趣:No visible cause for "Unexpected token ILLEGAL"