課程
/前端開發
/Node.js
/進擊Node.js基礎(一)
觸發data事件的時候,data的參數的類型是Buffer類型,使用html +=data,會自動把Buffer類型轉換成String,當遇到寬字節的中文的時候就有可能出現亂碼?。?!node不支持中文編碼???
2015-06-14
源自:進擊Node.js基礎(一) 5-10
正在回答
Node.js 不支持完整的Unicode,很多字符無法用string 表示。公平地說這不是Node.js 的缺陷,而是JavaScript 標準的問題。目前JavaScript 支持的字符集還是雙字節的UCS2,即用兩個字節來表示一個Unicode 字符,這樣能表示的字符數量是65536。顯然,僅僅是漢字就不止這個數目,很多生僻漢字,以及一些較為罕見語言的文字都無法表示。這其實是一個歷史遺留問題,像2000 年問題(俗稱千年蟲)一樣,都起源于當時人們的主觀判斷。最早的Unicode 設計者認為65536個字符足以囊括全世界所有的文字了,因此那個時候盲目兼容Unicode 的系統或平臺(如Windows、Java 和JavaScript)在后來都遇到了問題。???????? Unicode 隨后意識到2個字節是不夠的,因此推出了UCS4,即用4 個字節來表示一個Unicode 字符。很多原先用定長編碼的UCS2 的系統都升級為了變長編碼的UTF-16,因為只有它向下兼容UCS2。UTF-16 對UCS2 以內的字符采用定長的雙字節編碼,而對它以外的部分使用多字節的變長編碼。這種方式的好處是在絕大多數情況下它都是定長的編碼,有利于提高運算效率,而且兼容了UCS2,但缺點是它本質還是變長編碼,程序中處理多少有些不便。??????? 許多號稱支持UTF-16 的平臺仍然只支持它的子集UCS2,而不支持它的變長編碼部分。相比之下,UTF-8 完全是變長編碼,有利于傳輸,而UTF-32 或UCS4 則是4 字節的定長編碼,有利于計算。??????? 當下的JavaScript 內部支持的仍是定長的UCS2 而不是變長的UTF-16,因此對于處理UCS4 的字符它無能為力。所有的JavaScript 引擎都被迫保留了這個缺陷,包括V8 在內,因此你無法使用Node.js 處理罕見的字符。想用Node.js 實現一個多語言的字典工具?還是算了吧,除非你放棄使用string 數據類型,把所有的字符當作二進制的Buffer 數據來處理。
舉報
本視頻教程帶你揭開Node.js的面紗,帶你走進一個全新世界
Copyright ? 2025 imooc.com All Rights Reserved | 京ICP備12003892號-11 京公網安備11010802030151號
購課補貼聯系客服咨詢優惠詳情
慕課網APP您的移動學習伙伴
掃描二維碼關注慕課網微信公眾號
2016-01-08
Node.js 不支持完整的Unicode,很多字符無法用string 表示。公平地說這不是Node.js 的缺陷,而是JavaScript 標準的問題。目前JavaScript 支持的字符集還是雙字節的UCS2,即用兩個字節來表示一個Unicode 字符,這樣能表示的字符數量是65536。顯然,僅僅是漢字就不止這個數目,很多生僻漢字,以及一些較為罕見語言的文字都無法表示。這其實是一個歷史遺留問題,像2000 年問題(俗稱千年蟲)一樣,都起源于當時人們的主觀判斷。最早的Unicode 設計者認為65536個字符足以囊括全世界所有的文字了,因此那個時候盲目兼容Unicode 的系統或平臺(如Windows、Java 和JavaScript)在后來都遇到了問題。?
??????? Unicode 隨后意識到2個字節是不夠的,因此推出了UCS4,即用4 個字節來表示一個Unicode 字符。很多原先用定長編碼的UCS2 的系統都升級為了變長編碼的UTF-16,因為只有它向下兼容UCS2。UTF-16 對UCS2 以內的字符采用定長的雙字節編碼,而對它以外的部分使用多字節的變長編碼。這種方式的好處是在絕大多數情況下它都是定長的編碼,有利于提高運算效率,而且兼容了UCS2,但缺點是它本質還是變長編碼,程序中處理多少有些不便。
??????? 許多號稱支持UTF-16 的平臺仍然只支持它的子集UCS2,而不支持它的變長編碼部分。相比之下,UTF-8 完全是變長編碼,有利于傳輸,而UTF-32 或UCS4 則是4 字節的定長編碼,有利于計算。
??????? 當下的JavaScript 內部支持的仍是定長的UCS2 而不是變長的UTF-16,因此對于處理UCS4 的字符它無能為力。所有的JavaScript 引擎都被迫保留了這個缺陷,包括V8 在內,因此你無法使用Node.js 處理罕見的字符。想用Node.js 實現一個多語言的字典工具?還是算了吧,除非你放棄使用string 數據類型,把所有的字符當作二進制的Buffer 數據來處理。