在nodejs中将GBK转UTF
问题
在对接第三方接口时接口返回的响应数据格式为GBK
而服务端语言使用的是nodejs
于是常规的方式接收到数据后中文呈现乱码
心路历程
通过网上查找解决方案,最多的就是使用以下方式将GBK
转为UTF
// 可以通过该命令`npm install iconv-lite`安装插件,并引入(*已安装可忽略*)
const iconv = require("iconv-lite")
let str = "你好"
let gbkStr = iconv.encode(str, "gbk") // 可以通过encode将字符串转为gbk格式的二进制buffer流
console.log(str,"转为GBK后", gbkStr)
console.log("GBK字符串显示", gbkStr.toString())
let utfStr = iconv.decode(gbkStr, 'gbk') // 然后将二进制buffer流通过decode转换回来
console.log("复原字符串显示", utfStr)
// output
// 你好 转为GBK后 <Buffer c4 e3 ba c3>
// GBK字符串显示 ���
// 复原字符串显示 你好
这个方案很简单但是我遇到了另一个简单的问题
axios.post(TAPI_URL, {sign: sign,agentAccount: TAPI_ACCOUNT,busiBody: data,
}).then((res) => {console.log("res.data: ", res.data)
})
// 通过打印可以看出我们在http响应中拿到的数据已经是字符串了
// output
// res.data: {// "code": 0,
// "msg": "���"
// }
那么怎么通过�����ɹ�
已经乱码的字符串转换成buffer
再解析呢,我又查阅了很多网上的方案还是同上面一样,只要搜索nodejs
中gbk
转utf
出现的就都是说用iconv.decode(buffer, 'gbk')
怎么样都没找到将已经乱码的字符串转换成buffer
解决问题
于是我转而思考另一个方向,可以在接收响应的时候就直接接收二进制buffer流吗?
果然换了一个方向得以解决了这个问题
axios.post(TAPI_URL, {sign: sign,agentAccount: TAPI_ACCOUNT,busiBody: data,
}, {responseType: 'arraybuffer' // 设置响应数据类型为二进制缓存流
}).then((res) => {console.log("res.data: ", res.data)// 别忘了将转化好后的字符串恢复为json对象const data = JSON.parse(iconv.decode(res.data, "gbk")) // 解析gbk字符集console.log("data: ", data)
})
// output
// res.data: {// "code": 0,
// "msg": "���"
// }
// data: {// "code": 0,
// "msg": "你好"
// }
思考
通过以上的问题我们发现了两个关键点
buffer
responseType
buffer
iconv
源码
declare module 'iconv-lite' {export function decode(buffer: Buffer, encoding: string, options?: Options): string;export function encode(content: string, encoding: string, options?: Options): Buffer;...
}
从上面代码可以看出decode
并不是直接把乱码字符串传入,而是传入对应字符格式的Buffer
类型
Node.js Buffer(缓冲区)
JavaScript 语言自身只有字符串数据类型,没有二进制数据类型。
但在处理像TCP流或文件流时,必须使用到二进制数据。因此在 Node.js中,定义了一个 Buffer 类,该类用来创建一个专门存放二进制数据的缓存区。
在 Node.js 中,Buffer 类是随 Node 内核一起发布的核心库。Buffer 库为 Node.js 带来了一种存储原始数据的方法,可以让 Node.js 处理二进制数据,每当需要在 Node.js 中处理I/O操作中移动的数据时,就有可能使用 Buffer 库。原始数据存储在 Buffer 类的实例中。一个 Buffer 类似于一个整数数组,但它对应于 V8 堆内存之外的一块原始内存。
可以再通过学习与使用熟悉该数据类型
responseType
通过对解决问题的思考方向转变后,我通过查看axios
源码找到了最终解决的接口
axios
源码
export interface AxiosInstance {...// post方法中的第三个变量config为AxiosRequestConfig接口格式类型post<T = any, R = AxiosResponse<T>>(url: string, data?: any, config?: AxiosRequestConfig): Promise<R>;...
}
export interface AxiosRequestConfig {...// 该类型提供了ResponseType类型的responseType属性responseType?: ResponseType;...
}
// ResponseType类型中可使用的参数如下,其中就有arraybuffer数据类型
export type ResponseType = | 'arraybuffer' | 'blob' | 'document' | 'json' | 'text' | 'stream'
查看axios
源码我们找到了使响应格式呈buffer
格式的接口,通过ResponseType
类型的定义还可以发现响应类型的设置还有其他几种类型
在nodejs中将GBK转UTF相关推荐
- nodejs+html转换pdf,Nodejs 中将html转换成pdf文件
Nodejs 中将html转换成pdf文件,Nodejs Convert html into pdf 1. 下载phantomjs.exe,将该文件放在根目录 2. 编写pdf.js文件(在githu ...
- html批量转码工具,文件转码工具(文件GBK与UTF编码批量转码工具)
这是一个将批量的txt文件转换成Unicode编码的工具,转换的速度快,使用简单. 什么是Unicod编码? Unicode(统一码.万国码.单一码)是一种在计算机上使用的字符编码.Unicode 是 ...
- PHP搜索utf和gbk,php中判断是gbk还是utf
// 返回: true - 含GB编码 false - 为UTF-8编码 function is_gb2312($str) { for($i=0; $i $v = ord( $str[$i] ); i ...
- Android studio中将gbk转换为utf-8编码
导入带有中文字符的项目时乱码常常是不速之客. 中文乱码 乱码的出现往往是由编码格式不同造成的 第一步:用文件自己的编码格式打开 右键File Encoding->选择文件自己的格式 ->R ...
- 帝国CMS7.5响应式后台美化模板 支持GBK+UTF
介绍: 帝国CMS7.5响应式后台美化模板 支持GBK+UTF 1.支持帝国CMS7.5版本,GBK.UTF编码 2.采用ZUI前端框架开发 3.响应式布局,兼容多终端分辨率,包含:19201080, ...
- 再谈java乱码:GBK和UTF-8互转尾部乱码问题分析
一直以为java中任意unicode字符串可以使用任意字符集转为byte[]再转回来只要不抛出异常就不会丢失数据事实证明这是错的. 经过这个实例也明白了为什么 getBytes()需要捕获异常虽然有时 ...
- 帝国CMS7.5会员中心美化版V1.0GBKamp;UTF
介绍: 1.支持帝国CMS7.5版本,GBK.UTF编码 2.采用框架式开发 3.响应式布局,兼容多终端分辨率,包含:19201080,1400900,1366768,1024768,10241366 ...
- GBK转unicode码查询表的改进
上篇文章<GBK转unicode码查询表>中有一个美中不足的地方,就是占用的内存空间稍大了一点,约128KB,当然,对于PC这种平台无所谓,但对于一些场合来说,能省内存就省内存,何况那个表 ...
- NodeJS Warning: Accessing non-existent property ‘padLevels‘ 解决办法
NodeJS Warning: Accessing non-existent property 'padLevels' 解决办法 Node14以下版本的NodeJS项目在Node14及以上版本中运行时 ...
最新文章
- .net面试问题汇总(转)
- 自动生成想“变”就“变”
- hiveServer2 和 metastore的一点解读。
- android 动画 返回,Android“菜单图标变返回”动画
- nginx location反向代理不对等时的处理
- python迭代对象_Python迭代对象与迭代器
- 解决django需要手动调整数据库,避免manage.py各种报错
- Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class
- 10月份出版图书《玩转虚拟机基于VMware+Windows》
- Tomcat+MySql+jdbc
- 运行Android项目时,报Installation failed due to invalid APK file!错误的解决办法
- し: make jianjie的文本网页
- 云开发校园合伙人招募令|阿里实习生直通面试名额等你来PICK!
- lsdyna如何设置set中的node_list_如何理解vue的双向绑定
- vs2017开发ActiveX(主讲OCX)(十)、手动添加自定义方法
- GridView合并表头单元格
- APP瘦身大法--AndResGuard的使用
- 微型计算机是台式机,#有货自远方来# 黑五买的新“玩具” — Intel 英特尔 NUC5PPYH 微型电脑...
- HTML5游戏制作完全指南
- AI智能音箱技术方案开发
热门文章
- UltraISO和Rufus制作ubantuU盘启动教程
- Python获取与处理文件路径/目录路径
- QT使用vlc实现在线视频播放器
- matlab输入输出gui,代码编写的 gui 实现基本的输入输出
- 报表自动生成软件有哪些?热门报表自动生成软件推荐
- 【NOI 2004】郁闷的出纳员
- 蓝牙UART和PCM接口传输的信号 硬件接口
- c语言中 amp amp 是位运算符吗,c语言位运算符(c语言位运算符的用法举例)
- ZZULIOJ.1156: 单数变复数
- UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xfa in position 24: ordinal not in range(128)