Node.js 自帶的 toString() 方法不支持 gbk,因此中文轉換的時候需要加載第三方庫,推薦以下兩個編碼轉換庫,iconv-lite 和 encoding。
iconv, iconv-lite 和 encoding 是什么?
iconv:是在類 Unix 系統中一種標准字符集轉換接口,用於在不同字符集編碼之間進行轉換,最早出現在 HP-UX 系統中。
iconv-lite:是 iconv 的純 js 實現,支持的編碼包括 node.js 原生編碼:utf8, ucs2, ascii, binary, base64;同時支持廣泛使用的單字節編碼:Windows 125x family, ISO-8859 family, IBM/DOS codepages, Macintosh family, KOI8 family, latin1, us-ascii;多字節編碼:gbk, gb2313, Big5, cp950。官方宣稱比 node-iconv 更快。
encoding:是對 node-iconv 和 iconv-lite 的再次封裝,encoding 首先調用 node-iconv,如果 node-iconv 無法解析,則調用 iconv-lite 作為替代方案。
iconv-lite 安裝使用
1. 安裝
$ npm install iconv-lite
2. 使用
var iconv = require('iconv-lite'); // Convert from an encoded buffer to js string.
str = iconv.decode(buf, 'win1251'); // Convert from js string to an encoded buffer.
buf = iconv.encode("Sample input string", 'win1251'); // Check if encoding is supported
iconv.encodingExists("us-ascii")
3. iconv-lite和node-iconv的性能對比
operation iconv@1.2.4 iconv-lite@0.2.4
---------------------------------------------------------- encode('win1251') ~115 Mb/s ~230 Mb/s decode('win1251') ~95 Mb/s ~130 Mb/s
encoding 安裝使用
1. 安裝
$ npm install encoding
2. 使用
encoding 模塊就一個方法 convert(),使用方法為:encoding.convert(text, toCharset, fromCharset)。
- text: 需要轉換的對象,可以為 Buffer 或者 String 對象。
- toCharset: 轉換后的編碼。
- fromCharset: 轉換前的編碼,缺省為 uft8。
轉換后的輸入結果為 Buffer 對象。
var encoding = require('encoding'); var result = encoding.convert("ÕÄÖÜ", "Latin_1"); console.log(result); //<Buffer d5 c4 d6 dc>
番外篇:jschardet
什么是 jschardet?
jschardet 是由 António Afonso 從 Python 的 chardet 移植到 Javascript 的 jschardet。
1. 安裝
$ npm install jschardet
2. 使用
var jschardet = require("jschardet") // "àíàçã" in UTF-8
jschardet.detect("\xc3\xa0\xc3\xad\xc3\xa0\xc3\xa7\xc3\xa3") // { encoding: "utf-8", confidence: 0.9690625 }
// "次常用國字標準字體表" in Big5
jschardet.detect("\xa6\xb8\xb1\x60\xa5\xce\xb0\xea\xa6\x72\xbc\xd0\xb7\xc7\xa6\x72\xc5\xe9\xaa\xed") // { encoding: "Big5", confidence: 0.99 }