Node中的字符編碼

unicode

首先搞清兩個概念汤徽,字符集編碼

  • 字符集:字符集是一張碼表桥言,它規(guī)定了文字與數(shù)字的一一對應(yīng)關(guān)系。與計算機的內(nèi)部表示沒有必然的聯(lián)系厌漂。比如ASCII字符集,它規(guī)定了0~127這128個數(shù)字與哪些字符的對應(yīng)關(guān)系斟珊。常見的字符集包括:ASCII苇倡,GB2312,unicode等。
  • 編碼: 字符集是數(shù)字與字符對應(yīng)起來的方案旨椒,編碼則是在計算機與網(wǎng)絡(luò)中存儲晓褪、傳輸這些數(shù)字的方案。常見的編碼方式有utf8综慎、utf16涣仿、GBK等。

unicode(統(tǒng)一碼示惊、萬國碼好港、單一碼、標(biāo)準(zhǔn)萬國碼)是世界范圍內(nèi)通用的字符集米罚,是一種標(biāo)準(zhǔn)媚狰,它可以使電腦同時顯示世界上數(shù)十種文字。unicode編碼系統(tǒng)為表達任意語言的任意字符而設(shè)計阔拳,使用4字節(jié)的數(shù)字來表達每個字母、符號类嗤,或者表意文字糊肠。在unicode出現(xiàn)之前,世界各地都搞一套自己語音的字符集遗锣,混亂不堪货裹,于是unicode組織就挺身而出,它們的目標(biāo)是囊括世界上所有的字符精偿,同時解決歷史問題弧圆,將既有的字符編碼方案以Unicode 編碼方案來加以取代。
歷史元老中笔咽,ASCII搔预、GB2312是兼字符集與編碼方案為一身的,而unicode則是單純的字符集叶组,它有多種編碼方案的實現(xiàn)拯田,如utf8、GBK等等甩十。字符集和編碼的概念被徹底分離且模塊化的模型船庇,其實是 Unicode 時代才得到廣泛認(rèn)同的。不同的編碼方案在存儲空間上各有長處侣监,有的存英文省鸭轮,有的存中文省。

JavaScript的字符串是unicode字符串橄霉,內(nèi)部以utf-16編碼保存窃爷。
ES6中的String.prototype.codePointAt()方法可以得到指定字符的unicode碼點。
JavaScript中不存在gbk字符串、utf8字符串這樣的東西吞鸭,但可以通過宿主環(huán)境或是第三方庫提供的轉(zhuǎn)碼方法寺董,來將js字符串轉(zhuǎn)化為其他編碼,并用某種數(shù)據(jù)結(jié)構(gòu)(如瀏覽器中的ArrayBuffer刻剥,Node中的Buffer)來保存遮咖。

node支持的編碼類型

目前有:

  • ascii
  • base64
  • binary
  • hex
  • ucs2/ucs-2/utf16le/utf-16le
  • utf8/utf-8
  • latin1 (ISO8859-1, only in node 6.4.0+)

使用node的讀寫流時,若data是string造虏,則可以指定encoding參數(shù)御吞,以指定的編碼類型來讀寫字符串;若data是buffer漓藕,則忽略encoding參數(shù)陶珠。例如文件讀寫:

fs.writeFile('./xx.txt', '哈哈哈', 'utf8') // use string and encoding
fs.writeFile('./xx.txt', new Buffer('哈哈哈', 'utf8')) // use string
fs.readFile('./xx.txt', 'utf8', (err, data) => {...}) // data is a string
fs.readFile('./xx.txt', (err, data) => {...}) // data is a raw buffer

node中轉(zhuǎn)換字符編碼

node是不支持gbk、gb2312等上述以外編碼的享钞,如果指定encoding為它們會報錯Unknown encoding: xx揍诽。但可以通過第三方模塊iconv-lite來轉(zhuǎn)換編碼±跏基本操作如下:

// 讀
const iconv = require('iconv-lite')
let data = fs.readFileSync('./xx.txt') // 假設(shè)txt是GB2312編碼的暑脆,data是一個buffer,存儲GB2312編碼的字符串?dāng)?shù)據(jù)
let str = iconv.decode(data, 'GB2312') // 將buffer解碼為string
// 拿到一個buffer欲將它轉(zhuǎn)為string狐肢,必須先知道它的編碼類型
// 寫
const str = '國慶節(jié)萬歲'
let b = iconv.encode(str, 'GB2312') // b是一個buffer添吗,存儲的是str的GB2312編碼的二進制
fs.writeFile('./xx.txt', b) // 將str的GB2312編碼數(shù)據(jù)寫入到文件中

Base64/hex

Base64與hex都是將二進制數(shù)據(jù)編碼成字符串的編碼方式,針對的是二進制字節(jié)而非字符串份名。
因此碟联,要獲得某個string的base64編碼時,應(yīng)該先得到string的二進制僵腺,再對二進制進行base6編碼:

// 編碼
const str = '哈哈'
let b = Buffer.from(str) // b中存的是哈哈的utf8編碼二進制
let base64Code = b.toString('base64') // '5ZOI5ZOI'
// 解碼
const code = '5ZOI5ZOI'
let str = Buffer.from('5ZOI5ZOI', 'base64') // '哈哈'
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鲤孵,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子辰如,更是在濱河造成了極大的恐慌裤纹,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,907評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件丧没,死亡現(xiàn)場離奇詭異鹰椒,居然都是意外死亡,警方通過查閱死者的電腦和手機呕童,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,987評論 3 395
  • 文/潘曉璐 我一進店門漆际,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人夺饲,你說我怎么就攤上這事奸汇∈┓” “怎么了?”我有些...
    開封第一講書人閱讀 164,298評論 0 354
  • 文/不壞的土叔 我叫張陵擂找,是天一觀的道長戳吝。 經(jīng)常有香客問我,道長贯涎,這世上最難降的妖魔是什么听哭? 我笑而不...
    開封第一講書人閱讀 58,586評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮塘雳,結(jié)果婚禮上陆盘,老公的妹妹穿的比我還像新娘。我一直安慰自己败明,他們只是感情好隘马,可當(dāng)我...
    茶點故事閱讀 67,633評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著妻顶,像睡著了一般酸员。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上讳嘱,一...
    開封第一講書人閱讀 51,488評論 1 302
  • 那天沸呐,我揣著相機與錄音,去河邊找鬼呢燥。 笑死,一個胖子當(dāng)著我的面吹牛寓娩,可吹牛的內(nèi)容都是我干的叛氨。 我是一名探鬼主播,決...
    沈念sama閱讀 40,275評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼棘伴,長吁一口氣:“原來是場噩夢啊……” “哼寞埠!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起焊夸,我...
    開封第一講書人閱讀 39,176評論 0 276
  • 序言:老撾萬榮一對情侶失蹤仁连,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后阱穗,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體饭冬,經(jīng)...
    沈念sama閱讀 45,619評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,819評論 3 336
  • 正文 我和宋清朗相戀三年揪阶,在試婚紗的時候發(fā)現(xiàn)自己被綠了昌抠。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,932評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡鲁僚,死狀恐怖炊苫,靈堂內(nèi)的尸體忽然破棺而出裁厅,到底是詐尸還是另有隱情,我是刑警寧澤侨艾,帶...
    沈念sama閱讀 35,655評論 5 346
  • 正文 年R本政府宣布执虹,位于F島的核電站,受9級特大地震影響唠梨,放射性物質(zhì)發(fā)生泄漏袋励。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,265評論 3 329
  • 文/蒙蒙 一姻成、第九天 我趴在偏房一處隱蔽的房頂上張望插龄。 院中可真熱鬧,春花似錦科展、人聲如沸均牢。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,871評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽徘跪。三九已至,卻和暖如春琅攘,著一層夾襖步出監(jiān)牢的瞬間垮庐,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,994評論 1 269
  • 我被黑心中介騙來泰國打工坞琴, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留哨查,地道東北人。 一個月前我還...
    沈念sama閱讀 48,095評論 3 370
  • 正文 我出身青樓剧辐,卻偏偏與公主長得像寒亥,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子荧关,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,884評論 2 354

推薦閱讀更多精彩內(nèi)容