我遇到了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编码。
我不知道为什么会这样做,或者为什么它不系统。
答案 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-only
或ascii_only
,但真正考虑的唯一变体是ASCIIOnly
。