觸發(fā)data事件Buffer類(lèi)型
觸發(fā)data事件的時(shí)候,data的參數(shù)的類(lèi)型是Buffer類(lèi)型,使用html +=data,會(huì)自動(dòng)把Buffer類(lèi)型轉(zhuǎn)換成String,當(dāng)遇到寬字節(jié)的中文的時(shí)候就有可能出現(xiàn)亂碼?。。ode不支持中文編碼???
觸發(fā)data事件的時(shí)候,data的參數(shù)的類(lèi)型是Buffer類(lèi)型,使用html +=data,會(huì)自動(dòng)把Buffer類(lèi)型轉(zhuǎn)換成String,當(dāng)遇到寬字節(jié)的中文的時(shí)候就有可能出現(xiàn)亂碼?。。ode不支持中文編碼???
2015-06-14
舉報(bào)
2016-01-08
Node.js 不支持完整的Unicode,很多字符無(wú)法用string 表示。公平地說(shuō)這不是Node.js 的缺陷,而是JavaScript 標(biāo)準(zhǔn)的問(wèn)題。目前JavaScript 支持的字符集還是雙字節(jié)的UCS2,即用兩個(gè)字節(jié)來(lái)表示一個(gè)Unicode 字符,這樣能表示的字符數(shù)量是65536。顯然,僅僅是漢字就不止這個(gè)數(shù)目,很多生僻漢字,以及一些較為罕見(jiàn)語(yǔ)言的文字都無(wú)法表示。這其實(shí)是一個(gè)歷史遺留問(wèn)題,像2000 年問(wèn)題(俗稱(chēng)千年蟲(chóng))一樣,都起源于當(dāng)時(shí)人們的主觀判斷。最早的Unicode 設(shè)計(jì)者認(rèn)為65536個(gè)字符足以囊括全世界所有的文字了,因此那個(gè)時(shí)候盲目兼容Unicode 的系統(tǒng)或平臺(tái)(如Windows、Java 和JavaScript)在后來(lái)都遇到了問(wèn)題。?
??????? Unicode 隨后意識(shí)到2個(gè)字節(jié)是不夠的,因此推出了UCS4,即用4 個(gè)字節(jié)來(lái)表示一個(gè)Unicode 字符。很多原先用定長(zhǎng)編碼的UCS2 的系統(tǒng)都升級(jí)為了變長(zhǎng)編碼的UTF-16,因?yàn)橹挥兴蛳录嫒軺CS2。UTF-16 對(duì)UCS2 以?xún)?nèi)的字符采用定長(zhǎng)的雙字節(jié)編碼,而對(duì)它以外的部分使用多字節(jié)的變長(zhǎng)編碼。這種方式的好處是在絕大多數(shù)情況下它都是定長(zhǎng)的編碼,有利于提高運(yùn)算效率,而且兼容了UCS2,但缺點(diǎn)是它本質(zhì)還是變長(zhǎng)編碼,程序中處理多少有些不便。
??????? 許多號(hào)稱(chēng)支持UTF-16 的平臺(tái)仍然只支持它的子集UCS2,而不支持它的變長(zhǎng)編碼部分。相比之下,UTF-8 完全是變長(zhǎng)編碼,有利于傳輸,而UTF-32 或UCS4 則是4 字節(jié)的定長(zhǎng)編碼,有利于計(jì)算。
??????? 當(dāng)下的JavaScript 內(nèi)部支持的仍是定長(zhǎng)的UCS2 而不是變長(zhǎng)的UTF-16,因此對(duì)于處理UCS4 的字符它無(wú)能為力。所有的JavaScript 引擎都被迫保留了這個(gè)缺陷,包括V8 在內(nèi),因此你無(wú)法使用Node.js 處理罕見(jiàn)的字符。想用Node.js 實(shí)現(xiàn)一個(gè)多語(yǔ)言的字典工具?還是算了吧,除非你放棄使用string 數(shù)據(jù)類(lèi)型,把所有的字符當(dāng)作二進(jìn)制的Buffer 數(shù)據(jù)來(lái)處理。