仓库源文站点原文


title: Node获取GBK编码“字符串” date: 2017-10-05 08:50:46 tags: [Node.js,String] categories: Node.js

description: 首先,Node内部是无法直接获取GBK编码“字符串”的,只不过使用到GBK的场景均有相应的应对方法。最初学习时,陷入了接口返回值必须是“字符串”的误区,然而想把GBK编码从Buffer强转为GBK中文String类型是做不到的。本篇借助了hex码,达成了字符串形式传输GBK数据的需要,用以发送给其他语言编写的系统。

UTF8 to GBK Hex String

iconv-lite

通常都会使用 iconv-lite 这个包实现Node的编码转换,但是这个包是基于 Buffer 的,如果传递给其他语言的系统,需要先转换为 String 字符串。

在网上查阅了相关资料,并没有给出很好的解答。一些比较老的回答都在说,Node中无法把Buffer转换成gbk字符串。

俗话说有问题找师兄,果然,咨询同组师兄后得到了期望的结果。转换过程很巧妙,在此分享出来:

const iconv = require('iconv-lite');

function toGBKString(str) {
  return iconv.encode(str, 'gbk')
    .reduce((pre, cur) => `${pre}${cur.toString(16)}`, '');
}

以上是不加百分号的,如果需要可以在模板字符串中自行加上。

2018-04-18更

由于Buffer本身支持hex的转换

Buffer instances are commonly used to represent sequences of encoded characters such as UTF-8, UCS2, Base64, or even Hex-encoded data. It is possible to convert back and forth between Buffer instances and ordinary JavaScript strings by using an explicit character encoding.

'hex' - Encode each byte as two hexadecimal characters.

因此reduce可以继续简化为

iconv.encode(str, 'gbk').toString('hex');