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

\uFFFD、または視覚化された � は、文字列内の文字が無効な文字であることを示すブラウザーの方法です。

文字列自体には引き続き が含まれます\uFFF0が、その文字は定義されていないため、ブラウザーは代わりに � をレンダリングします。

私の場合、コンソールに
Google Chrome が表示されます: ￰ (白いボックス、黒い境界線、疑問符付き)。
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 に答える