Node.JS JSON.parse UTF-8 issue

Node.JS JSON.parse UTF-8 issue

本文关键字:UTF-8 issue parse JSON JS Node      更新时间:2023-09-26

我已经构建了一个小脚本,允许我从Google搜索API中获取关键字建议。

主要问题是,如果响应包含特殊字符(如àéú等):我的应用程序返回无法读取的关键字,如:ï?½,ï??½a,a va,﮽majuscule,ï°½a marche,ï½,ï

这是我的Node.js脚本:

var express = require('express');
var request = require('request');
var app = express();
app.get('/sug', function (req, res) {
    var KW = req.query.KW ;
    console.time("Délai");
    var url = "http://clients1.google.fr/complete/search?hl=fr&q=" + KW + "&json=t&client=hp";
    request(url, function (err, resp, body) {
        body = JSON.parse(body);
        res.end(body.toString());
        console.timeEnd("Délai");
    });
});
app.listen(1337);
console.log('Serveur : OK');

打电话很容易,只需打字http://localhost:1337/sug?KW=ç。

你知道如何解决这个问题并使utf-8工作吗?

正如vmkcom所说,因为响应使用ISO-8859-1,所以必须手动转换为utf-8。iconv包可以帮助您:

var request = require('request');
var iconv = require('iconv');
var KW = 'ç' ;
console.time("Délai");
var url = "http://clients1.google.fr/complete/search?hl=fr&q=" + KW + "&json=t&client=hp";
var options = {
    url: url,
    encoding: null // << set encoding to null so request don't try to force utf-8
};
var ic = new iconv.Iconv('iso-8859-1', 'utf-8');
request(options, function (err, resp, body) {
    // body is a Buffer not a string, convert to utf-8 buffer then to utf-8 string
    body = ic.convert(body).toString('utf-8');
    console.log(body);
    console.timeEnd("Délai");
});

感谢您的帮助。所以我用你的反馈做了这个代码:

var express = require('express');
var request = require('request');
var iconv = require('iconv');
var app = express();
app.listen(1337);
console.log('Serveur : OK');
app.get('/sug', function (req, res) {
    var KW = req.query.KW;
    console.time("Délai");
    var url = "http://clients1.google.fr/complete/search?hl=fr&q=" + KW + "&json=t&client=hp";
    var options = {
        url: url,
        encoding: null // << set encoding to null so request don't try to force utf-8
    };
    var ic = new iconv.Iconv('iso-8859-1', 'utf-8');
    request(options, function (err, resp, body) {
        res.set({ 'content-type': 'application/json; charset=utf-8' });
        body = ic.convert(body).toString('utf-8');
        body = JSON.parse(body);
        res.end(body.toString());
        console.timeEnd("Délai");
    });
});

它工作得很好!

http://localhost:1337/sug?KW=%C3%A7a

ça,ça、ça-va、çaMarche、ça y est、çaffilm、çailestrevenu、çadesoi、çateva、ça‘est bien passé、çam'éneural、〔object object〕

响应集
response.set({"content-type":"application/json;charset=utf-8"});

app.use('/reverse',函数(重新请求,响应){request.get({url:url,json:true,headers:{"User-Agent":"request"}},(err,res,data)=>{if(err){console.log('错误:',错误);}否则如果(res.statusCode!==200){

        response.end(JSON.stringify({status : 'error'}));
    } else {
        response.set({ 'content-type': 'application/json; charset=utf-8' });
        response.end(JSON.stringify({status : 'ok','api' : 'website : https://homeandroid.ir','json':data}));
    }
});

});