Node.js環(huán)境中使用GBK編碼方式
NodeJS環(huán)境中使用GBK編碼
Node默認支持的編碼格式
Node中的Buffer對象支持以下編碼(以6.9.1版本為例):參考API[https://npm.taobao.org/mirrors/node/latest/docs/api/buffer.html#buffer_buffers_and_character_encodings]
- ascii :7-bit ASCII data,舍棄高位
- utf8 : 多字節(jié)編碼,大多數(shù)情況下String的默認編碼格式
- utf16le : 2或4字節(jié)編碼
- base64 : BASE64
- latin1 (別名 binary): 單字節(jié)編碼( A way of encoding the Buffer into a one-byte encoded string (as defined by the IANA in RFC1345, page 63, to be the Latin-1 supplement block and C0/C1 control codes))
- binary : latin1的別名
- hex : 單字節(jié)編碼,用2位十六進制數(shù)字編碼一個字節(jié)
GBK與UTF-8
簡單說一個是國家標準(GB)、一個是國際標準。
GBK是我國頒布的一種漢字編碼,作為一個體系,其前身是GB2312,后來演進為GB18030。這個系列的編碼標準致力于解決中國國內(nèi)面臨的文字的編碼問題,支持的語言包括中文漢字(簡體)、日語、韓語、藏文、蒙文、維吾爾文等,主要還是中文。常見漢字用兩個字節(jié)編碼。
UTF-8是一種國際標準,同一個體系的還有UTF-16等。UTF-8致力于解決地球上全部文字的編碼表示問題,除了東亞文字還包括其他語言的編碼,如波斯文。其編碼一個文字采用兩個或三個字節(jié)。
一個常用漢字占用的字節(jié)數(shù):
- GB2312:2字節(jié),GBK:2字節(jié),GB18030:2字節(jié),UTF-8:3字節(jié)
稀有的漢字:
- GB2312: 不包含, GBK:包含,GB18030:包含,UTF-8:包含
特別稀有的漢字:
- GB2312: 不包含, GBK:不包含,GB18030:包含,UTF-8:不包含
兩種編碼同時存在,且會長期共存。同一個系統(tǒng)內(nèi)部盡量不要混用。
使用iconv-lite做編碼轉(zhuǎn)換
Node環(huán)境下處理漢字編碼常用的有iconv和iconv-lite,前者使用二進制庫實現(xiàn),后者純JS實現(xiàn)(性能上后者略好【沒有實際測試】),這里只介紹iconv-lite[https://npm.taobao.org/package/iconv-lite]
iconv-lite支持的編碼格式包括:
- 所有node.js原生支持的編碼: utf8, ucs2 / utf16-le, ascii, binary, base64, hex.
- 其他unicode編碼: utf16, utf16-be, utf-7, utf-7-imap.
- 所有常見單字節(jié)編碼:Windows 125x系列, ISO-8859系列, IBM/DOS codepages, Macintosh系列, KOI8系列, 其他iconv庫支持的編碼. 支持latin1, us-ascii這類別名.
- 所有常見多字節(jié)編碼: CP932, CP936, CP949, CP950, GB2313, GBK, GB18030, Big5, Shift_JIS, EUC-JP.
官方給出的例子:
var iconv = require('iconv-lite');
str = iconv.decode(new Buffer([0x68, 0x65, 0x6c, 0x6c, 0x6f]), 'win1251');
buf = iconv.encode("Sample input string", 'win1251');
也支持Stream方式使用,參見 https://npmmirror.com/package/iconv-lite
對于早期版本的Node,可以通過extendNodeEncodings在不影響代碼結(jié)構(gòu)的情況下擴展Node各原生接口支持的編碼種類;這種方式在較新版本(v4+)已經(jīng)廢棄無法使用。
給出一個從GBK文件讀取內(nèi)容,然后編碼轉(zhuǎn)存為UTF-8編碼的例子:
var buffer = Buffer.from(fs.readFileSync('gbkFile.txt',{encoding:'binary'}),'binary');
console.log(buffer);//得到文件內(nèi)容對應(yīng)的Buffer
var text = iconv.decode(buffer,'GBK');//使用GBK解碼
console.log(text);
//console.log(iconv.encode(text, 'utf8'));
//console.log(iconv.encode(text, 'gbk'));
fs.writeFileSync('utfFile.txt',iconv.encode(text, 'utf8'),'binary'); //按二進制方式寫入
fs.writeFileSync('utfFile2.txt',text,'utf8'); //按UTF8寫入
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
nvm報錯Now?using?node?v版本號(64-bit)圖文解決方法
這篇文章主要給大家介紹了關(guān)于nvm報錯Now?using?node?v版本號(64-bit)的解決方法,文中將解決的辦法介紹的非常詳細,對遇到這個問題的朋友具有一定的參考借鑒價值,需要的朋友可以參考下2023-11-11
node.js中的events.emitter.once方法使用說明
這篇文章主要介紹了node.js中的events.emitter.once方法使用說明,本文介紹了events.emitter.once的方法說明、語法、接收參數(shù)、使用實例和實現(xiàn)源碼,需要的朋友可以參考下2014-12-12
Rust與NodeJs?web開發(fā)對比總結(jié)大全
Rust編譯的Wasm模塊在Node.js中運行,可實現(xiàn)高性能計算后端,同時利用JavaScript的靈活性,這篇文章主要介紹了Rust與NodeJs?web開發(fā)對比的相關(guān)資料,需要的朋友可以參考下2026-01-01
玩轉(zhuǎn)NODE.JS(四)-搭建簡單的聊天室的代碼
本篇文章主要介紹了利用NODE.JS搭建簡單的聊天室的代碼,有需要的可以了解一下。2016-11-11

