问题

在对接第三方接口时接口返回的响应数据格式为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再解析呢,我又查阅了很多网上的方案还是同上面一样,只要搜索nodejsgbkutf出现的就都是说用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相关推荐

  1. nodejs+html转换pdf,Nodejs 中将html转换成pdf文件

    Nodejs 中将html转换成pdf文件,Nodejs Convert html into pdf 1. 下载phantomjs.exe,将该文件放在根目录 2. 编写pdf.js文件(在githu ...

  2. html批量转码工具,文件转码工具(文件GBK与UTF编码批量转码工具)

    这是一个将批量的txt文件转换成Unicode编码的工具,转换的速度快,使用简单. 什么是Unicod编码? Unicode(统一码.万国码.单一码)是一种在计算机上使用的字符编码.Unicode 是 ...

  3. PHP搜索utf和gbk,php中判断是gbk还是utf

    // 返回: true - 含GB编码 false - 为UTF-8编码 function is_gb2312($str) { for($i=0; $i $v = ord( $str[$i] ); i ...

  4. Android studio中将gbk转换为utf-8编码

    导入带有中文字符的项目时乱码常常是不速之客. 中文乱码 乱码的出现往往是由编码格式不同造成的 第一步:用文件自己的编码格式打开 右键File Encoding->选择文件自己的格式 ->R ...

  5. 帝国CMS7.5响应式后台美化模板 支持GBK+UTF

    介绍: 帝国CMS7.5响应式后台美化模板 支持GBK+UTF 1.支持帝国CMS7.5版本,GBK.UTF编码 2.采用ZUI前端框架开发 3.响应式布局,兼容多终端分辨率,包含:19201080, ...

  6. 再谈java乱码:GBK和UTF-8互转尾部乱码问题分析

    一直以为java中任意unicode字符串可以使用任意字符集转为byte[]再转回来只要不抛出异常就不会丢失数据事实证明这是错的. 经过这个实例也明白了为什么 getBytes()需要捕获异常虽然有时 ...

  7. 帝国CMS7.5会员中心美化版V1.0GBKamp;UTF

    介绍: 1.支持帝国CMS7.5版本,GBK.UTF编码 2.采用框架式开发 3.响应式布局,兼容多终端分辨率,包含:19201080,1400900,1366768,1024768,10241366 ...

  8. GBK转unicode码查询表的改进

    上篇文章<GBK转unicode码查询表>中有一个美中不足的地方,就是占用的内存空间稍大了一点,约128KB,当然,对于PC这种平台无所谓,但对于一些场合来说,能省内存就省内存,何况那个表 ...

  9. NodeJS Warning: Accessing non-existent property ‘padLevels‘ 解决办法

    NodeJS Warning: Accessing non-existent property 'padLevels' 解决办法 Node14以下版本的NodeJS项目在Node14及以上版本中运行时 ...

最新文章

  1. .net面试问题汇总(转)
  2. 自动生成想“变”就“变”
  3. hiveServer2 和 metastore的一点解读。
  4. android 动画 返回,Android“菜单图标变返回”动画
  5. nginx location反向代理不对等时的处理
  6. python迭代对象_Python迭代对象与迭代器
  7. 解决django需要手动调整数据库,避免manage.py各种报错
  8. Detected both log4j-over-slf4j.jar AND bound slf4j-log4j12.jar on the class
  9. 10月份出版图书《玩转虚拟机基于VMware+Windows》
  10. Tomcat+MySql+jdbc
  11. 运行Android项目时,报Installation failed due to invalid APK file!错误的解决办法
  12. し: make jianjie的文本网页
  13. 云开发校园合伙人招募令|阿里实习生直通面试名额等你来PICK!
  14. lsdyna如何设置set中的node_list_如何理解vue的双向绑定
  15. vs2017开发ActiveX(主讲OCX)(十)、手动添加自定义方法
  16. GridView合并表头单元格
  17. APP瘦身大法--AndResGuard的使用
  18. 微型计算机是台式机,#有货自远方来# 黑五买的新“玩具” — Intel 英特尔 NUC5PPYH 微型电脑...
  19. HTML5游戏制作完全指南
  20. AI智能音箱技术方案开发

热门文章

  1. UltraISO和Rufus制作ubantuU盘启动教程
  2. Python获取与处理文件路径/目录路径
  3. QT使用vlc实现在线视频播放器
  4. matlab输入输出gui,代码编写的 gui 实现基本的输入输出
  5. 报表自动生成软件有哪些?热门报表自动生成软件推荐
  6. 【NOI 2004】郁闷的出纳员
  7. 蓝牙UART和PCM接口传输的信号 硬件接口
  8. c语言中 amp amp 是位运算符吗,c语言位运算符(c语言位运算符的用法举例)
  9. ZZULIOJ.1156: 单数变复数
  10. UnicodeDecodeError: ‘ascii‘ codec can‘t decode byte 0xfa in position 24: ordinal not in range(128)