【问题标题】:Node.JS JSON.parse UTF-8 issueNode.JS JSON.parse UTF-8 问题
【发布时间】:2016-03-27 11:02:27
【问题描述】:

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

主要问题是响应是否包含特殊字符(如 à é ù 等):我的应用程序返回不可读的关键字,例如:�,�a,�a va,� majuscule,ï ¿½a marche,�,�a y est,�a 电影,�gag,�a il est revenu,�a va de soi,,[object Object]

这是我的 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 正常工作吗?

【问题讨论】:

  • 您发布的 URL 是网络本地 URL,因此不在您网络上的任何人(即我们)都无法访问。
  • clients1.google.fr 响应存在问题。它是用“ISO-8859-1”编码的,它返回["ç",["�","�a","� encoding","�in takvimi","�eyrek alt�n fiyat�","��plak k�zlar","�a��atay ulusoy","��plak kad�nlar","�ukurova �1\u20444niversitesi","�ocuk nas�l yap�l�r"],[],{"google:suggesttype":["QUERY","QUERY","QUERY","QUERY","QUERY","QUERY","QUERY","QUERY","QUERY","QUERY"]}] 但是在转换成UTF-8之后,我们得到了奇怪的符号¿½,�a
  • @vmkcom 那么为什么这个 URL 可以工作:clients1.google.fr/complete/… ??
  • @Tiddo 是的,你必须安装 node.js 并运行我的脚本才能在你的浏览器上看到它;)
  • 因为您的浏览器支持Content-Type HTTP 响应标头并正确解释编码。

标签: javascript json node.js utf-8


【解决方案1】:

就像 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");
});

【讨论】:

    【解决方案2】:

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

    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,ça marche,ça y est,ça film,ça il est revenu,ça va de soi,ça te va,ça s'est bien passé,ça m'énerve,,[object Object ]

    【讨论】:

      【解决方案3】:

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

      app.use('/reverse',function (requsting,response) { 请求.get({ 网址:网址, json:是的, 标头:{'用户代理':'请求'} }, (err, res, data) => { 如果(错误){ console.log('错误:', err); } else if (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}));
      
          }
      });
      

      });

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-19
        • 1970-01-01
        • 2011-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多