首页 > 解决方案 > 谷歌翻译回复文本乱码

问题描述

我正在构建一个小型命令行实用程序来帮助我在 nodejs 中进行一些翻译。问题是我从谷歌得到的响应文本是乱码。我能说的最好的一点是,nodejs 正在发送一个正确编码的请求,但显然不是。如果我使用 ANSI 字符集,一切都会按预期工作。主要思想当然是不要在源代码中放置字符串,我正在像这样尝试解决问题。源代码被编码为 UTF8,而我正在解析以获取相关字符串的数据是 UTF16 LE 格式,但我认为这对于这个示例并不重要。

const https = require('https');

let uri = 'https://translate.googleapis.com/translate_a/single?client=gtx&sl=ru&tl=en&dt=t&q=Приобрести контейнеры с амуницией';

console.log(uri);
console.log(encodeURI(uri));
console.log(decodeURI(encodeURI(uri)));

https.get(encodeURI(uri), (res) =>
{
    const { statusCode } = res;
    let error;

    if (statusCode !== 200)
    {
        error = new Error('Request Failed: ' + statusCode);
    }

    if (error)
    {
        console.log(error.message);
        res.resume();
        return;
    }

    let data = '';

    res.on('data', (chunk) =>
    {
        console.log('chunks:', chunk);
        data += chunk;
    });

    res.on('end', () =>
    {
        let parsed;

        try {
            parsed = JSON.parse(data);
        } catch (e) {
            console.log('parsing error', e);
        }

        console.log(data.length, data);
        console.log(parsed[0][0][0]);
    });
}).on('error', (e) =>
{
    console.error(e);
});

这是我在命令行中得到的输出。

  1. 原始的uri
  2. 编码的 uri
  3. 解码后的编码 uri
  4. 数据响应转储
  5. 响应字符串和字符串的大小
  6. json解码字符串

我假设 nodejs 正在向 google 发送一个乱码请求,但我不明白如何解决这个问题。

https://translate.googleapis.com/translate_a/single?client=gtx&sl=ru&tl=en&dt=t&q=Приобрести контейнеры с амуницией
https://translate.googleapis.com/translate_a/single?client=gtx&sl=ru&tl=en&dt=t&q=%D0%9F%D1%80%D0%B8%D0%BE%D0%B1%D1%80%D0%B5%D1%81%D1%82%D0%B8%20%D0%BA%D0%BE%D0%BD%D1%82%D0%B5%D0%B9%D0%BD%D0%B5%D1%80%D1%8B%20%D1%81%20%D0%B0%D0%BC%D1%83%D0%BD%D0%B8%D1%86%D0%B8%D0%B5%D0%B9
https://translate.googleapis.com/translate_a/single?client=gtx&sl=ru&tl=en&dt=t&q=Приобрести контейнеры с амуницией
chunks: <Buffer 5b 5b 5b 22 d0 a0 d1 9f d0 a1 d0 82 d0 a0 d1 91 d0 a0 d1 95 d0 a0 20 c2 b1 20 d0 a1 d0 82 d0 a0 c2 b5 d0 a1 d0 83 d0 a1 2c 20 d0 a0 d0 81 d0 a0 d1 94 ... >
165 '[[["РџСЂРёРѕР ± ресС, РЁРєРѕРЅС‚РµР№РЅРµСЂС ‹СЃ Р ° РјСѓРЅРЁС † ией","Приобрести контейнеры СЃ амуницией",null,null,3]],null,"ru"]'
РџСЂРёРѕР ± ресС, РЁРєРѕРЅС‚РµР№РЅРµСЂС ‹СЃ Р ° РјСѓРЅРЁС † ией

如果我在浏览器中加载请求 uri,我会得到预期的结果。

[[["Purchase containers with ammunition","Приобрести контейнеры с амуницией",null,null,3]],null,"ru"]

标签: node.jsgoogle-translate

解决方案


好的,新的一天带来新的想法。我今天早上发现可能缺少一些标头,结果证明我的请求需要提供有效的用户代理,但仅适用于这些 UTF 请求。去搞清楚。各种标头组合使响应更加混乱,因此需要一些猜测才能到达那里。

let headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:63.0) Gecko/20100101 Firefox/63.0'
};

https.get(uri, { headers: headers }, (res) =>
{
    ...
})

推荐阅读