将Windows1252转换为NodeJS特殊字符中的utf-8

时间:2019-06-26 18:07:05

标签: node.js encoding character-encoding

我正在用NodeJS 12版构建一个Web应用程序。我有一个旧MySQL数据库中的数据。由于旧数据库的编码问题,有些字段包含无法正确显示的字符。已经有一些类似的问题,但是没有一个问题解决了我的问题。经过尝试之后,我离解决方案还差一点,但是在这方面仍然需要帮助。

要转换的数据库中的当前值:

Rikuchi SokuryoÌ„bu [cartographer], 陸地測é‡éƒ¨

所需的新数据库值:

Rikuchi Sokuryōbu [cartographer], 陸地測量部

问题是same as described in this similar question。但是,接受的答案不能解决我的问题。我需要编写一个NodeJS来将数据库中的数据转换为可读的字符串。

我也尝试遵循the answer in this similar question。我知道该值首先需要转换为二进制,然后再转换为所需的编码。但是,它不会返回期望的结果。我尝试使用iconv和iconv-lite软件包。

尝试1:

let buf = new Buffer(body, 'binary');
let conv = new iconv.Iconv('windows-1252', 'utf8');
let str = conv.convert(buf).toString();
console.log(`original: ${body} output: ${str.toString()}`);

// original: Rikuchi SokuryoÌ„bu [cartographer], 陸地測é‡éƒ¨
// output: Rikuchi SokuryoМbu [cartographer], й"ёеS°жё¬й!Џй’Ё

ATTEMPT 2:iconv-lite

let buf = new Buffer(body, 'binary');
const str = iconvlite.decode(buf, 'windows-1252');
console.log(`original: ${body} output: ${str.toString()}`);

// original: Rikuchi SokuryoÌ„bu [cartographer], 陸地測é‡éƒ¨
// output: Rikuchi SokuryoМbu [cartographer], й"ёеS°жё¬й!Џй’Ё

尝试3:iconv-lite

// This one *almost* works however there are still some undefined characters

let buf = new Buffer(body, 'utf-8');
const win = iconvlite.encode(buf, 'windows-1252');
console.log(`original: ${body} output: ${win.toString()}`);

// original: Rikuchi SokuryoÌ„bu [cartographer], 陸地測é‡éƒ¨
// output: Rikuchi Sokuryōbu [cartographer], 陸地測�?部

更新:

该网站string-functions.com可以对字符串进行编码和解码。

可以使用以下设置正确解码整个有问题的字符串:“使用Windows-1252编码”和“使用utf-8解码”

它对于此问题的较大示例也非常适用。我只需要确切地复制此站点如何进行转换即可。尝试#3的代码非常接近,但是必须缺少一步。

stringfunctions.com

3 个答案:

答案 0 :(得分:2)

如果您收到诸如问号(Unicode块)之类的答复,则意味着您的记事本(IDE)以utf8格式显示它,但它以另一种格式获取数据。

要修复此问题,我使用了iconv

const { Iconv } = require('iconv');
const convertedXmlResponse = Iconv('windows-1251', 'utf8')
    .convert(dataBuffer)
    .toString();

答案 1 :(得分:1)

很棒的帖子,谢谢@pengz,这对我有用。我同意所有其他解决方案都遗漏了撇号和其他字符。这是唯一对我有用的解决方案。但是要注意一件事:我能够完成相同的操作,但都是使用 iconvlite:

const win = iconvlite.encode(body, 'windows-1252');
const str = iconvlite.decode(win, 'utf-8');
return str.toString();

答案 2 :(得分:0)

我通过使用Windows-1252模块对原始文本进行编码,然后使用iconv-lite模块对其进行解码来解决此问题。

const win = windows1252.encode(body);
const str = iconvlite.decode(win, 'utf-8');
return str.toString();