105

これが何という名前なのかわからないので、探すのに苦労しています。JavaScript を使用して からhttp\u00253A\u00252F\u00252Fexample.comへの Unicode で文字列をデコードするにはどうすればよいですか? 、http://example.comを試したので、残っているのは文字列の置換だけだと思います。unescapedecodeURIdecodeURIComponent

編集:文字列は入力されていませんが、別のコードからの部分文字列です。したがって、問題を解決するには、次のようなものから始める必要があります。

var s = 'http\\u00253A\\u00252F\\u00252Fexample.com';

unescape() が機能しない理由を示してくれることを願っています。

4

7 に答える 7

132

編集 (2017-10-12) :

@MechaLynx と @Kevin-Weberunescape()は、ブラウザ以外の環境では推奨されておらず、TypeScript には存在しないことに注意してください。decodeURIComponentドロップイン交換です。より広い互換性のために、代わりに以下を使用してください。

decodeURIComponent(JSON.parse('"http\\u00253A\\u00252F\\u00252Fexample.com"'));
> 'http://example.com'

元の答え:

unescape(JSON.parse('"http\\u00253A\\u00252F\\u00252Fexample.com"'));
> 'http://example.com'

すべての作業をJSON.parse

于 2012-10-13T04:24:51.473 に答える
124

更新: これは、古いブラウザーまたはブラウザー以外のプラットフォームに適用されるソリューションであり、説明目的で有効であることに注意してください。最新の回答については、以下の @radicand の回答を参照してください。


これは Unicode のエスケープ文字列です。最初に文字列がエスケープされ、次にユニコードでエンコードされました。通常の状態に戻すには:

var x = "http\\u00253A\\u00252F\\u00252Fexample.com";
var r = /\\u([\d\w]{4})/gi;
x = x.replace(r, function (match, grp) {
    return String.fromCharCode(parseInt(grp, 16)); } );
console.log(x);  // http%3A%2F%2Fexample.com
x = unescape(x);
console.log(x);  // http://example.com

説明するには: 正規表現を使用して を探します\u0025。ただし、置換操作にはこの文字列の一部しか必要ないため、括弧を使用して、再利用する部分を分離し0025ます。この孤立した部分をグループと呼びます。

式の末尾のgi部分は、最初のインスタンスだけでなく、文字列内のすべてのインスタンスと一致する必要があること、および一致では大文字と小文字が区別されないことを示します。この例では不要に見えるかもしれませんが、これにより汎用性が増します。

さて、ある文字列から次の文字列に変換するには、各一致の各グループに対していくつかの手順を実行する必要がありますが、単純に文字列を変換するだけではそれを行うことはできません。便利なことに、String.replace 操作は、一致ごとに実行される関数を受け入れることができます。その関数の戻り値は、文字列内の一致自体を置き換えます。

この関数が受け入れる 2 番目のパラメーター (使用する必要があるグループ) を使用し、それを同等の utf-8 シーケンスに変換してから、組み込みunescape関数を使用して文字列を適切な形式にデコードします。

于 2011-10-25T06:36:05.033 に答える
21

unescape()の使用は非推奨であり、たとえば TypeScript コンパイラでは機能しないことに注意してください。

radicand の回答と以下のコメント セクションに基づいて、更新されたソリューションを次に示します。

var string = "http\\u00253A\\u00252F\\u00252Fexample.com";
decodeURIComponent(JSON.parse('"' + string.replace(/\"/g, '\\"') + '"'));

http://example.com

于 2016-11-03T20:33:22.017 に答える
0

これはこの正確な質問に対する答えではありませんが、検索結果からこのページにアクセスし、(私のように) エスケープされたコードポイントのシーケンスを指定して単一の Unicode 文字を作成しようとしている人は、複数の文字列を渡すことができることに注意してください。そうする引数String.fromCodePoint()

String.fromCodePoint(parseInt("1F469", 16), parseInt("200D", 16), parseInt("1F4BC", 16)) // ‍

もちろん、文字列を解析して 16 進コードポイント文字列を抽出し、次のようにすることもできます。

let codePoints = hexCodePointStrings.map(s => parseInt(s, 16));
let str = String.fromCodePoint(...codePoints);
于 2021-08-20T19:33:31.790 に答える