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 触发我的 NodeJS 应用程序
- 应用程序从 API-Server
请求数据
- API-Server 将数据发送到 NodeJS 应用程序
- 我的应用程序打印出 API 的原始 response-data,其中已经有那些奇怪的字符 �
- 该应用程序然后尝试使用 Iconv 将它们转换为 UTF-8,它现在向我显示这个 '�' 字符
还有一件奇怪的事:
当我将 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 转换文本。我希望这个帖子对其他人有帮助,因为这些信息对我来说已经散布在许多不同的帖子中。
我创建了一个 NodeJS 应用程序,它应该从外部 API-Server 获取一些数据。该服务器仅以 'Content-Type: text/plain;charset=ISO-8859-1' 的形式提供其数据。我已经通过服务器的 Header-Data 获得了该信息。
现在我遇到的问题是“ä”、“ö”或“ü”等特殊字符显示为 �。 我尝试使用 Iconv 将它们转换为 UTF-8,但后来我得到了这些东西 '�'...
我的问题是,我做错了什么?
我使用 Postman 进行测试。这些是我测试所有内容的步骤:
- 使用 Postman 触发我的 NodeJS 应用程序
- 应用程序从 API-Server 请求数据
- API-Server 将数据发送到 NodeJS 应用程序
- 我的应用程序打印出 API 的原始 response-data,其中已经有那些奇怪的字符 �
- 该应用程序然后尝试使用 Iconv 将它们转换为 UTF-8,它现在向我显示这个 '�' 字符
还有一件奇怪的事: 当我将 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 转换文本。我希望这个帖子对其他人有帮助,因为这些信息对我来说已经散布在许多不同的帖子中。