1

我正在使用 http node.js 模块进行简单的 instagram API 调用。只是这样一个简单的请求:

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);
    });

另外,为什么要将“输出”转换为对象,然后再转换回字符串,而不是将其传递给响应时收到的 websocket。

于 2012-09-20T21:03:54.560 回答
0

我已经确定数据来自这样的 instagram,除了尝试转义或删除非 utf-8 字符外,没有什么可以做的。由于只有某些字段是这样的,而我的应用程序不需要这些字段,我可以绕过它。

于 2012-09-21T21:19:35.957 回答