已知服务器返回的是gb2312编码的字符串,该怎么转为uft8格式?不转的话就乱码
发布于 2 年前 作者 DitieNoder 2451 次浏览 来自 问答

技术小白摸索小众模块,结果编码的事情搞不定了,来请教各位大佬

1、背景:使用的模块是node-zoom2,是个图书编目领域的小众应用模块,发挥的作用是从各大图书馆查询数据。 图书馆由于中文存储量大,所以很多都是用GB2312编码来存数据的,部分图书馆跟上时代提供了utf8的库。

2、现象:从GB2312服务器获取的内容,打印出来时就是中文乱码。从UTF8服务器获取的内容就能正常显示中文。 图1:从GB2312服务器获取的内容,直接打印时中文乱码,然后试图用iconv-lite模块转码gbk,就直接转出了“锟斤拷” image.png

图2:从UTF8服务器获取的内容,正常 image.png

3、分析:查了很多帖子,试了很多方法都不行,最后网上的成功经验似乎都指向了【必须服务器端返回数据时使用buffer形式,才能在接收数据后正确转码】。 另外,node-zoom2这个模块说白了是在C语言上套了个壳,所以给作者留言后,见 https://github.com/dengelke/node-zoom2/issues/30 ,作者让找源头的官方,目前正在等回复中。

所以我也来CNode请教下,看看是否有其他实践智慧应对这种情况?

6 回复

记得 用 axios 的话, 是配置 一下 responseType: ‘arraybuffer’ 后,再 iconv.decode(resp.data, ‘gbk’) 就行了

@Kayakyx 是的,必须服务器返回buffer才行。头秃的是服务器返回的是gb2312编码。 如果解决不了这个卡点,就只能弃坑了

@DitieNoder 按照1楼的方法处理就可以, 服务端可以不用改

服务器返回的,必然是一堆byte,只是不同的客户端收到这一堆byte,可能会自动做不同的解释。 一楼说的axios 配置 responseType: ‘arraybuffer’ 其实就是告诉axios “不要任何解释,给我原始bytes”

@dbit-xia 如果是axios模块的话我知道用法了,可现在通过的是node-zoom2模块呀

@myy 对对就是这个意思,现在估计需要node-zoom2模块的作者修改一下,看看能不能支持这种设置了

回到顶部