0

我在 IE11 中遇到了一个奇怪的问题。考虑以下内容(riot.js 框架的一部分):

var s = "{JSON.stringify(\\{ amount: Math.floor(reward.amount) \\})}";
var s1 = s.replace(/\\{/g, '\uFFF0');

在 localhost 上运行此代码时,它运行良好。但是在我们的暂存环境中运行时,\{片段不会被替换为\uFFF0(代码点 65520),而是被替换为(代码\uFFFD点 65533)。这意味着它稍后在尝试将特殊字符替换回时失败{

replace方法是浏览器的本机方法。包含 HTML(字符串是 DOM 属性)和 javascript 的文件由服务器返回并带有charset=utf-8标头并编码。在暂存环境中,它与其他文件捆绑在一起(尽管不是压缩或修改),并且仍然以 utf-8 编码。
我不知道它为什么这样做,或者为什么它不系统。

4

2 回答 2

0

我将问题追溯到 UglifyJs。默认情况下,它将转义的 unicode 字符替换为实际字符。所以:

var s1 = s.replace(/\\{/g, '\uFFF0');

在捆绑文件中变成这样:

var s1 = s.replace(/\\{/g, '￰');

在使用源映射进行调试时不可见,并且在 IE11 中表现不佳。

ASCIIOnly: true解决方案是向 Uglify添加选项。
注意:Uglify 文档将此选项称为ascii-onlyor ascii_only,但真正考虑的唯一变体是ASCIIOnly.

于 2015-11-23T10:52:57.500 回答
0

\uFFFD,或可视化:�,是浏览器向您显示字符串中的字符是无效字符的方式。

字符串本身仍将包含\uFFF0,但由于未定义该字符,因此浏览器会呈现 �。

对我来说,在控制台中,
谷歌浏览器显示:￰(白色框,黑色边框,带问号)。
Safari 显示:￰(白框,黑边,带问号)。
Internet explorer 显示:￰(白框,黑边)。
边缘显示:￰(白框,黑边)。
Firefox 显示:没有。

它们都是相同的字符串。只是不同的视觉表示,具体取决于浏览器。

var s = "{JSON.stringify(\\{ amount: Math.floor(reward.amount) \\})}",
    s1 = s.replace(/\\{/g, '\uFFF0'),
    charCode = s1.charCodeAt(16);

document.write(charCode + ' ' + String.fromCharCode(charCode));
document.write('|');
document.write('￰'.charCodeAt(0));
document.write('|');
document.write('x'.replace('x', '\uFFF0').charCodeAt(0));

(对我来说,在 Chrome 中,这个片段显示了我65520 ￰|65520|65520:)

于 2015-11-20T08:42:43.660 回答