我正在用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的代码非常接近,但是必须缺少一步。
答案 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();