node.js - 谷歌翻译回复文本乱码
问题描述
我正在构建一个小型命令行实用程序来帮助我在 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);
});
这是我在命令行中得到的输出。
- 原始的uri
- 编码的 uri
- 解码后的编码 uri
- 数据响应转储
- 响应字符串和字符串的大小
- 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"]
解决方案
好的,新的一天带来新的想法。我今天早上发现可能缺少一些标头,结果证明我的请求需要提供有效的用户代理,但仅适用于这些 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) =>
{
...
})
推荐阅读
- sql - 窗口滞后 sqlzoo.net #7
- apache-spark - 我正在使用 Google Cloud dataproc 集群运行 Spark。写入 GCS 的数据集卡在未完成的 1 个任务中
- arrays - 如何根据我的文本框在二维数组中搜索一个单词,并在 MS Access 表单中使用 vba 代码
- vector - 如何在加权图中跟踪 BFS 中的路径以及边的权重
- rest - 通过命令行检查 dig not on my network
- php - 当前页面为 1 时如何限制结果?
- webrtc - 使用 DataChannels 的 WebRTC Android 多用户文本聊天
- javascript - 单击后更改按钮的背景颜色
- javascript - Material UI Autocomplete如何取消选择的选项
- terraform - 如何从 terraform 输出中解密密码