NodeJS 和 Iconv - "ISO-8859-1" 到 "UTF-8"

NodeJS and Iconv - "ISO-8859-1" to "UTF-8"

我创建了一个 NodeJS 应用程序,它应该从外部 API-Server 获取一些数据。该服务器仅以 'Content-Type: text/plain;charset=ISO-8859-1' 的形式提供其数据。我已经通过服务器的 Header-Data 获得了该信息。

现在我遇到的问题是“ä”、“ö”或“ü”等特殊字符显示为 。 我尝试使用 Iconv 将它们转换为 UTF-8,但后来我得到了这些东西 '�'...

我的问题是,我做错了什么?


我使用 Postman 进行测试。这些是我测试所有内容的步骤:

还有一件奇怪的事: 当我将 Postman 直接连接到 API-Server 时,特殊字符也会正常显示。因此,我想我的应用程序导致了问题,但我看不出在哪里或为什么...


// Javascript代码:

try {
    const response = await axios.get(
      URL 
      {
        params: params, 
        headers: headers
      }
    );

    var iconv     = new Iconv('ISO-8859-1', 'UTF-8');
    var converted = await iconv.convert(response.data);
    return converted.toString('UTF-8');

  } catch (error) {
    throw new Error(error);
  }

经过更深入的研究,我想出了解决问题的办法。

所有问题的起因似乎都在 axios 或类似程序的 post 进程中。这是在接收到数据并将其转换为文本之后以及为我的 nodejs 应用程序生成响应之前不久的关闭步骤。

我所做的是将 axios 的 GET 方法的“responseType”定义为“ArrayBuffer”。因此,像这样调整 axios 是必要的:

var resArBuffer = await axios.get(
      URL, 
      {
        responseType: 'arraybuffer',
        params: params, 
        headers: headers
      }
    );

由于JavaScript很棒,ArrayBuffer本身提供了一个toString()方法,可以根据自己的定义将数据从ArrayBuffer转换为String:

    var response = resArBuffer.data.toString("latin1");

另一件值得一提的事情是我使用了“latin1”而不是“ISO-8859-1”。不要问我为什么,一些消息来源甚至建议使用“cp1252”,但是“latin1”在这里对我有用。

不幸的是,这还不够,因为我需要 UTF-8 格式的文本。使用“toString('utf-8')”本身也是错误的方法,因为它仍然会打印“�”符号。解决方法很简单。我使用“Buffer.from(...)”将“latin1”定义的文本转换为“” utf-8" 文本:

    var text = Buffer.from(response, 'utf-8').toString();

现在我得到了我需要的 UTF-8 转换文本。我希望这个帖子对其他人有帮助,因为这些信息对我来说已经散布在许多不同的帖子中。