Node.js環(huán)境中使用GBK編碼方式
NodeJS環(huán)境中使用GBK編碼
Node默認(rèn)支持的編碼格式
Node中的Buffer對(duì)象支持以下編碼(以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的默認(rèn)編碼格式
- 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位十六進(jìn)制數(shù)字編碼一個(gè)字節(jié)
GBK與UTF-8
簡(jiǎn)單說(shuō)一個(gè)是國(guó)家標(biāo)準(zhǔn)(GB)、一個(gè)是國(guó)際標(biāo)準(zhǔn)。
GBK是我國(guó)頒布的一種漢字編碼,作為一個(gè)體系,其前身是GB2312,后來(lái)演進(jìn)為GB18030。這個(gè)系列的編碼標(biāo)準(zhǔn)致力于解決中國(guó)國(guó)內(nèi)面臨的文字的編碼問(wèn)題,支持的語(yǔ)言包括中文漢字(簡(jiǎn)體)、日語(yǔ)、韓語(yǔ)、藏文、蒙文、維吾爾文等,主要還是中文。常見(jiàn)漢字用兩個(gè)字節(jié)編碼。
UTF-8是一種國(guó)際標(biāo)準(zhǔn),同一個(gè)體系的還有UTF-16等。UTF-8致力于解決地球上全部文字的編碼表示問(wèn)題,除了東亞文字還包括其他語(yǔ)言的編碼,如波斯文。其編碼一個(gè)文字采用兩個(gè)或三個(gè)字節(jié)。
一個(gè)常用漢字占用的字節(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:不包含
兩種編碼同時(shí)存在,且會(huì)長(zhǎng)期共存。同一個(gè)系統(tǒng)內(nèi)部盡量不要混用。
使用iconv-lite做編碼轉(zhuǎn)換
Node環(huán)境下處理漢字編碼常用的有iconv和iconv-lite,前者使用二進(jìn)制庫(kù)實(shí)現(xiàn),后者純JS實(shí)現(xiàn)(性能上后者略好【沒(méi)有實(shí)際測(cè)試】),這里只介紹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àn)單字節(jié)編碼:Windows 125x系列, ISO-8859系列, IBM/DOS codepages, Macintosh系列, KOI8系列, 其他iconv庫(kù)支持的編碼. 支持latin1, us-ascii這類別名.
- 所有常見(jiàn)多字節(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方式使用,參見(jiàn) https://npmmirror.com/package/iconv-lite
對(duì)于早期版本的Node,可以通過(guò)extendNodeEncodings在不影響代碼結(jié)構(gòu)的情況下擴(kuò)展Node各原生接口支持的編碼種類;這種方式在較新版本(v4+)已經(jīng)廢棄無(wú)法使用。
給出一個(gè)從GBK文件讀取內(nèi)容,然后編碼轉(zhuǎn)存為UTF-8編碼的例子:
var buffer = Buffer.from(fs.readFileSync('gbkFile.txt',{encoding:'binary'}),'binary');
console.log(buffer);//得到文件內(nèi)容對(duì)應(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'); //按二進(jìn)制方式寫入
fs.writeFileSync('utfFile2.txt',text,'utf8'); //按UTF8寫入
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
nvm報(bào)錯(cuò)Now?using?node?v版本號(hào)(64-bit)圖文解決方法
這篇文章主要給大家介紹了關(guān)于nvm報(bào)錯(cuò)Now?using?node?v版本號(hào)(64-bit)的解決方法,文中將解決的辦法介紹的非常詳細(xì),對(duì)遇到這個(gè)問(wèn)題的朋友具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-11-11
node.js中的events.emitter.once方法使用說(shuō)明
這篇文章主要介紹了node.js中的events.emitter.once方法使用說(shuō)明,本文介紹了events.emitter.once的方法說(shuō)明、語(yǔ)法、接收參數(shù)、使用實(shí)例和實(shí)現(xiàn)源碼,需要的朋友可以參考下2014-12-12
node Buffer緩存區(qū)常見(jiàn)操作示例
這篇文章主要介紹了node Buffer緩存區(qū)常見(jiàn)操作,涉及node.js操作Buffer緩存的創(chuàng)建、寫入、讀取、轉(zhuǎn)換等相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2019-05-05
Nodejs文件上傳、監(jiān)聽(tīng)上傳進(jìn)度的代碼
這篇文章主要介紹了Nodejs文件上傳、監(jiān)聽(tīng)上傳進(jìn)度,本文通過(guò)實(shí)例代碼給大家詳細(xì)介紹,對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
Rust與NodeJs?web開發(fā)對(duì)比總結(jié)大全
Rust編譯的Wasm模塊在Node.js中運(yùn)行,可實(shí)現(xiàn)高性能計(jì)算后端,同時(shí)利用JavaScript的靈活性,這篇文章主要介紹了Rust與NodeJs?web開發(fā)對(duì)比的相關(guān)資料,需要的朋友可以參考下2026-01-01
玩轉(zhuǎn)NODE.JS(四)-搭建簡(jiǎn)單的聊天室的代碼
本篇文章主要介紹了利用NODE.JS搭建簡(jiǎn)單的聊天室的代碼,有需要的可以了解一下。2016-11-11
使用Node.js實(shí)現(xiàn)一個(gè)文章生成器
本文將從零開始,講解如何使用Node.js來(lái)實(shí)現(xiàn)一個(gè)文章生成器,node里面有很多優(yōu)秀的模塊,現(xiàn)在我們就借助node的fs模塊來(lái)操控文本,來(lái)實(shí)現(xiàn)我們想要的效果,感興趣的小伙伴跟著小編一起來(lái)看看吧2024-07-07

