所需包:iconv-lite
转换过程:utf-8 -> decode(to buffer) -> convert to gbk(buffer also) -> write buffer to file.

首先安装包

npm i iconv-lite

以下为demo代码

const fs = require('fs');
const iconv = require('iconv-lite');
// 这里是utf8
let str = '这里是UTF8编码';
console.log(new Buffer(str).length);
// 转换成gbk
let encoded = iconv.encode(str, 'gbk');
fs.writeFile('./gbk.txt', encoded);

GBK详解

Unicode是全世界通用编码
UTF8,UTF16,UTF32只是Unicode的实现方式之一。UCS2是UTF16的子集,UCS2编码中每个Unicode使用两个字节编码,高字节在高位。Node.JS支持Buffer.toString(‘UTF8’)和Buffer.toString(‘UCS2’)。
GBK也是Unicode的实现方式之一,总共23940个编码,

UTF8与GBK进行转换,可以把Unicode作为中间编码。
UTF8编解Unicode规则简单,参见 UTF8
GBK编解Unicode无特定规则,一般可通过查表方式
GBK兼容ascii码,ascii字符用一字节编码,最高位为0,其它字符用两位编码,高字节从0x81。编解码时通过此规律对单字节和双字节字符加以区分。由此可见,GBK是单字节、双字节变长编码。
理解了上面几点后,编解码GBK文件其实只需要一个GBK–>Unicode的码表就够了。GBK编码时,通过Unicdoe–>GBK,生成相应的GBK字节流;GBK解码时,通过GBK–>Unicode,生成UCS2字节流,再通过buffer.toString(‘UCS2’)即可转换成string对象。

那么在nodejs中,utf8与gbk的实现方式为(依赖iconv-lite包):

const fs = require('fs');
let str = iconv.decode(buf, 'GBK'); //gbk转utf8
let buf = iconv.encode(str, 'GBK');//utf8转gbk


Node中的Buffer对象支持以下编码

  1. 'ascii' - 仅支持 7 位 ASCII 数据。如果设置去掉高位的话,这种编码是非常快的。
  2. 'utf8' - 多字节编码的 Unicode 字符。许多网页和其他文档格式都使用 UTF-8 。
  3. 'utf16le' - 2 或 4 个字节,小字节序编码的 Unicode 字符。支持代理对(U+10000 至U+10FFFF)。别名'ucs2'
  4. 'base64' - Base64 编码。当从字符串创建 Buffer 时,按照 RFC4648 第5章的规定,这种编码也将正确地接受“URL 与文件名安全字母表”。
  5. 'latin1' - 一种把 Buffer 编码成一字节编码的字符串的方式(由 IANA 定义在 RFC1345 第 63 页,用作Latin-1 补充块与 C0/C1 控制码)。别名'binary'
  6. 'hex' - 将每个字节编码为两个十六进制字符

参考资料

iconv-lite的API
Node.js环境中使用GBK编码

Last modification:October 28, 2019
If you think my article is useful to you, please feel free to appreciate