我正在构建一个小的命令行实用程序,以帮助我在nodejs中进行一些翻译。问题是我从Google收到的回复文本是乱码。据我所知,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);
});
这是我在命令行中得到的输出。
我假设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"]
答案 0 :(得分:0)
好的,新的一天带来了新的想法。我发现今天早上有些标头可能会丢失,事实证明我的请求需要提供有效的用户代理,但仅适用于这些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) =>
{
...
})