String.replace IE11中的奇怪行为

时间:2015-11-20 08:33:56

标签: javascript replace uglifyjs riot.js

我遇到了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编码。
我不知道为什么会这样做,或者为什么它不系统。

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

在捆绑文件中成为这个:

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

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

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