Nodejs高階 服務端字元編譯碼 亂碼處理

2021-09-07 14:37:21 字數 2523 閱讀 9446

在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 執行的...