【问题标题】:nodeJS: convert response.body in utf-8 (from windows-1251 encoding)nodeJS:在 utf-8 中转换 response.body(来自 windows-1251 编码)
【发布时间】:2021-07-13 20:11:02
【问题描述】:

我正在尝试将在 windows-1251 中编码的 HTML 正文转换为 utf-8,但我仍然在 html 上遇到混乱的字符。

它们基本上是俄语字母,但我无法正确显示它们。我得到??????? ?? ???

const GOT = require('got') // https://www.npmjs.com/package/got
const WIN1251 = require('windows-1251') // https://www.npmjs.com/package/windows-1251

async function query() {
    var body = Buffer.from(await GOT('https://example.net/', {resolveBodyOnly: true}), 'binary')
    var html = WIN1251.decode(body.toString('utf8'))
    console.log(html)
}

query()

【问题讨论】:

  • body.toString('utf8') 可能是错误的,因为如果body 不是 UTF-8,这一步已经替换了无效的 CP1251 字符。
  • @Evert 我也试过body.toString()
  • 也不要那样做。 javascript中的字符串 unicode,所以如果你在从CP1251转换之前将它转换为字符串,它总是会出错。您的 CP1251 库是否允许您使用缓冲区作为输入?
  • 我猜它只接受文本:npmjs.com/package/windows-1251
  • 你的 nodejs 服务器是否在 windows 上运行?我也在努力转换编码..,我所做的是使用一个 powershell 脚本,它总是将它编码为 utf-8,而无需指定输入格式。该脚本是通过 child_process 从 nodejs 应用程序调用的,基本上只包含这一行:$Utf8NoBomEncoding = New-Object System.Text.UTF8Encoding($False) + 读取和写入文件 ofc..

标签: node.js encoding


【解决方案1】:

你在这里来回做了很多愚蠢的编码。而且“背”甚至不匹配“前”。

首先,您使用got 库下载网页;默认情况下,got will dutifully decode response texts as UTF-8。你stuff the returned Unicode string into a Buffer with the binary encoding,它丢弃了 Unicode 字符串的每个 UTF-16 代码单元的较高八位字节。然后您使用.toString('utf-8') 将这个残缺字符串解释为 UTF-8(实际上,它很可能根本不是有效的 UTF-8)。然后将“UTF-8”字符串传递给windows-1251,将其解码为“代码页1251”字符串。所有这些混乱都不可能带来任何好处。

您要使用的windows-1251 包将所谓的“二进制”(伪拉丁语-1)字符串作为输入。您应该做的是获取二进制响应,将其解释为Latin-1/‘binary’ string,然后将其传递给windows-1251 库进行解码。

换句话说,使用这个:

const GOT = require('got');
const WIN1251 = require('windows-1251');

async function query() {
    const body = await GOT('https://example.net/', {
        resolveBodyOnly: true,
        responseType: 'buffer'
    });
    const html = WIN1251.decode(body.toString('binary'))
    console.log(html)
}

query()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 2012-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-30
    • 2012-01-24
    相关资源
    最近更新 更多