在web服務端開發中,字元的編譯碼幾乎每天都要打交道。編譯碼一旦處理不當,就會出現令人頭疼的亂碼問題。
不少從事node服務端開發的同學,由於對字元編碼碼相關知識了解不足,遇到問題時,經常會一籌莫展,花大量的時間在排查、解決問題。
文字先對字元編譯碼的基礎知識進行簡單介紹,然後舉例說明如何在node中進行編譯碼,最後是服務端的**案例。本文相關**示例可在這裡找到。
在網路通訊的過程中,傳輸的都是二進位制的位元位,不管傳送的內容是文字還是,採用的語言是中文還是英文。
舉個例子,客戶端向服務端傳送"你好"。
客戶端 --- 你好 ---> 服務端這中間包含了兩個關鍵步驟,分別對應的是編碼、解碼。
客戶端:將"你好"這個字串,編碼成計算機網路需要的二進位制位元位。
服務端:將接收到的二進位制位元位,解碼成"你好"這個字串。
總結一下:
編碼:將需要傳送的資料,轉成對應的二進位制位元位。
解碼:將二進位制位元位,轉成原始的資料。
上面有些重要的技術細節沒有提到,答案在下一小節。
上面提到字元、二進位制的轉換問題。既然兩者可以互相轉換,也就是說存在明確的轉換規則,可以實現字元<->二進位制的相互轉換。
這裡提到的轉換規則,其實就是我們經常聽到的字符集&字元編碼。
字符集是一系列字元(文字、標點符號等)的集合。字符集有很多,常見的有ascii、unicode、gbk等。不同字符集主要的區別在於包含字元個數的不同。
了解了字符集的概念後,接下來介紹下字元編碼。
字符集告訴我們支援哪些字元,但具體字元怎麼編碼,是由字元編碼決定的。比如unicode字符集,支援的字元編碼有utf8(常用)、utf16、utf32。
概括一下:
可以把字元編碼看成乙個對映表,客戶端、服務端就是根據這個對映表,來實現字元跟二進位制的編譯碼轉換。
舉個例子,"你"這個字元,在utf8編碼中,佔據三個位元組0xe4 0xbd 0xa0
,而在gbk編碼中,佔據兩個位元組0xc4 0xe3
。
上面已經提到了字元編譯碼所需的基礎知識。下面我們看乙個簡單的例子,這裡借助了icon-lite
這個庫來幫助我們實現編譯碼的操作。
可以看到,在字元編碼時,我們採用了gbk
。在解碼時,如果同樣採用gbk
,可以得到原始的字元。而當我們解碼時採用utf8
時,則出現了亂碼。
var iconv = require('iconv-lite');
var oritext = '你';
var encodedbuff = iconv.encode(oritext, 'gbk');
console.log(encodedbuff);
// var decodedtext = iconv.decode(encodedbuff, 'gbk');
console.log(decodedtext);
// 你
var wrongtext = iconv.decode(encodedbuff, 'utf8');
console.log(wrongtext);
// ��
通常我們需要處理編譯碼的場景有檔案讀寫、網路請求處理。這裡距網路請求的例子,介紹如何在服務端進行編譯碼。
假設我們執行著如下http服務,監聽來自客戶端的請求。客戶端傳輸資料時採用了gbk
編碼,而服務端預設採用的是utf8
編碼。
如果此時採用預設的utf8
對請求進行解碼,就會出現亂碼,因此需要特殊處理。
服務端**如下(為簡化**,這裡跳過了請求方法、請求編碼的判斷)
// 假設客戶端採用post方法,編碼為gbk
});server.listen(3000);對應的客戶端**如下:
var charset = 'gbk';
// 對字元"你"進行編碼
var reqbuff = iconv.encode('你', charset);
client.end(reqbuff);nodejs學習筆記
iconv-lite
Nodejs高階 服務端字元編譯碼 亂碼處理
在web服務端開發中,字元的編譯碼幾乎每天都要打交道。編譯碼一旦處理不當,就會出現令人頭疼的亂碼問題。不少從事node服務端開發的同學,由於對字元編碼碼相關知識了解不足,遇到問題時,經常會一籌莫展,花大量的時間在排查 解決問題。文字先對字元編譯碼的基礎知識進行簡單介紹,然後舉例說明如何在node中進...
Nodejs高階 服務端字元編譯碼 亂碼處理
在web服務端開發中,字元的編譯碼幾乎每天都要打交道。編譯碼一旦處理不當,就會出現令人頭疼的亂碼問題。不少從事node服務端開發的同學,由於對字元編碼碼相關知識了解不足,遇到問題時,經常會一籌莫展,花大量的時間在排查 解決問題。文字先對字元編譯碼的基礎知識進行簡單介紹,然後舉例說明如何在node中進...
服務端後台執行 nodejs
終端連線到伺服器,執行 node server.js,退出終端之後,程式就停止執行了。使用 forever 包可以搞定,解決方案如下 sudo npm install g forever registry forever start 指令碼檔案forever list檢視所有 forever 執行的...