9

最初の「\」文字自体が「\」としてエスケープされている Unicode 文字エスケープ シーケンス (\uXXXX) が埋め込まれた Javascript 文字列の表示に問題があります。文字列を変換して、エスケープ シーケンスを適切に評価し、正しい Unicode 文字で出力を生成するには、どうすればよいですか?

たとえば、次のような入力を扱っています。

"this is a \u201ctest\u201d";

「\」をデコードしようとしています 正規表現を使用します。例:

var out  = text.replace('/\/g','\');

出力テキストは次のようになります。

"this is a \u201ctest\u201d";

つまり、Unicode エスケープ シーケンスは、希望する二重引用符ではなく、実際のエスケープ シーケンスとして表示されます。

4

5 に答える 5

6

結局のところ、必要なのは unescape() ですが、'\uXXXX' ではなく '%uXXXX' を使用しています。

unescape(yourteststringhere.replace(/\/g,'%'))

于 2008-11-08T19:03:50.820 に答える
1

HTML エスケープされる可能性がある文字は「\」だけですか? '\uXXXX' が使用されている唯一の文字列エスケープでよろしいですか?

そうでない場合は、汎用の HTML-character/entity-reference-decoder および JS-string-literal-decoder が必要になります。残念ながら、JavaScript にはこのための組み込みメソッドがなく、大量の正規表現を手動で行うのは非常に面倒です。

文字列を要素の innerHTML プロパティに割り当てることでブラウザの HTML デコーダを利用し、JavaScript に上記のように文字列をデコードするように要求することができます。

var el= document.createElement('div');
el.innerHTML= s;
return eval('"'+el.firstChild.data+'"');

ただし、文字列が 100% 信頼されていないソースからのものである場合、これは信じられないほど醜いハックであり、セキュリティ ホールです。

弦はどこから来ているのですか?可能であれば、より強力なテキスト処理機能を利用できるサーバー側で問題に対処できるとよいでしょう。そして、バックスラッシュを不必要に HTML エスケープしているものを修正できれば、問題の修正自体を見つけることができます。

于 2008-11-09T02:19:41.003 に答える
1

これはひどい解決策ですが、これを行うことができます:

var x = "this is a \u201ctest\u201d".replace(/\/g,'\\')
// x is now "this is a \u201ctest\u201d"
eval('x = "' + x + '"')
// x is now "this is a “test”"

それはひどいです:

  • 文字列の内容がわからない場合、 eval は危険な場合があります

  • 文字列に実際の引用符があると、eval ステートメントでの文字列の引用が壊れます。

于 2008-11-08T19:05:12.720 に答える
0

これがそれであるかどうかはわかりませんが、入力を信頼できる場合、答えは eval() に関係している可能性があります。

于 2008-11-08T18:28:22.793 に答える
0

私は同じ方向に沿って考えていましたが、想像できるあらゆる方法で eval() を使用すると、同じエスケープ出力が得られました。例えば、

eval(new String("this is a \u201ctest&#amp;92;u201d"));

あるいは

eval(new String("this is a \u201ctest&#amp;92;u201d".replace('/\/g','\')));

すべて同じ結果になります。

"this is a \u201ctest\u201d";

どうにかして文字列を再評価または再解析するために Javascript エンジンを取得する必要があるかのようですが、どうすればよいかわかりません。おそらく eval() か、適切にエスケープされた入力を使用して新しい文字列を作成するだけでうまくいくと思いましたが、今は運がいいです。

基本的な質問は、指定された文字列を回転させるために何をしなければならないかです:

"this is a \u201ctest&#amp;92;u201d"

適切な Unicode 文字を使用する文字列に変換しますか?

于 2008-11-08T18:40:32.100 に答える