1

httpnode.jsモジュールを使用して単純なInstagramAPI呼び出しを行っています。このような単純なリクエスト:

getJSON : function(options, on_result, on_error) {

    var req = http.request(options, function(res) {

        var output = '';
        res.setEncoding('utf8');

        res.on('data', function (chunk) {
            console.log(chunk);
            return output += chunk;
        });

        return res.on('end', function() {
            var obj = JSON.parse(output);
            on_result(res.statusCode, obj);
        });
    });

    req.on('error', function(err) {
        on_error(err);
    });

    return req.end();
}

on_result関数は、JSON.stringifyを使用して文字列化し、次の関数を使用してWebソケットに送信します。

var connection = request.accept(null, request.origin);
connection.sendUTF(JSON.stringify(obj));

ノードサーバーを起動してブラウザでURLを指定すると、chromeとfirefoxから次のようになります。

テキストフレームをUTF-8としてデコードできませんでした。

私は昨日これを実行するのに全く問題がありませんでした。

http'on data'関数で、データをコンソールにログアウトしています。画面に表示されるものは、次のような特定のエスケープ文字を除いて問題ないように見えます。

"text":"\ud83d\ude1d\ud83d\ude02\ud83d\udc4f\ud83d\udc8b"
"full_name":"\ud83c\uddee\ud83c\uddf9\u21e8\u261eSara\u261c\u21e6\ud83c\uddee\ud83c\uddf9"

次に、JSONが文字列化されると、これらのエスケープシーケンスは次のようになります。

"text":"<d83d><de1d><d83d><de02><d83d><dc4f><d83d><dc8b>"
"full_name":"<d83c><ddee><d83c><ddf9>â¨âSaraââ¦<d83c><ddee><d83c><ddf9>"

これが、ブラウザがUTF-8について不平を言う理由を説明しています。

私は何か間違ったことをしていますか?

4

2 に答える 2

1

次のように\uをエスケープしてみてください。

    return res.on('end', function() {
        var escaped_output = output.replace(/\\u/g, "\\\\u");  //<--
        var obj = JSON.parse(escape_output);
    });

また、なぜ'output'をオブジェクトに変換してから文字列に戻し、応答で受信したWebSocketに渡さないのですか。

于 2012-09-20T21:03:54.560 に答える
0

データはこのようなInstagramからのものであり、utf-8以外の文字をエスケープまたは削除する以外にできることはほとんどないと判断しました。特定のフィールドのみがこのようなものであり、私のアプリケーションはそれらのフィールドを必要としないので、私はそれを回避することができます。

于 2012-09-21T21:19:35.957 に答える