首頁 web前端 js教程 Nodejs中服務端字元編解碼與亂碼處理方法介紹

Nodejs中服務端字元編解碼與亂碼處理方法介紹

Sep 05, 2017 am 09:48 AM
javascript nodejs 亂碼

這篇文章主要介紹了Nodejs進階之服務端字元編解碼和亂碼處理,具有一定的參考價值,有興趣的小夥伴們可以參考一下

##寫在前面

在web服務端開發中,字元的編解碼幾乎每天都要打交道。編解碼一旦處理不當,就會出現令人頭痛的亂碼問題。

不少從事node服務端開發的同學,由於對字元編碼碼相關知識了解不​​足,遇到問題時,經常會一籌莫展,花大量的時間在排查、解決問題。

文字先對字元編解碼的基礎知識進​​行簡單介紹,然後舉例說明如何在node中進行編解碼,最後是服務端的程式碼案例。本文相關程式碼範例可在這裡找到。

關於字元編解碼

在網路通訊的過程中,傳輸的都是二進位的位元位,不管發送的內容是文字還是圖片,採用的語言是中文還是英文。

舉個例子,客戶端向服務端發送"你好"。

客戶端 --- 你好 ---> 服務端

這中間包含了兩個關鍵步驟,分別對應的是編碼、解碼。


1.客戶端:將"你好"這個字串,編碼成電腦網路所需的二進位位元。


2.服務端:將接收到的二進位位元,解碼成"你好"這個字串。

總結一下:


1.編碼:將需要傳送的數據,轉成對應的二進位位元。


2.解碼:將二進位位元,轉換成原始的資料。

上面有些重要的技術細節沒有提到,答案在下一小節。

  • 客戶端怎麼知道"你好"這個字元對應的位元位是多少?

  • 服務端收到二進位位元組之後,怎麼知道對應的字串是什麼?

關於字元集和字元編碼

上面提到字元、二進位的轉換問題。既然兩者可以互相轉換,也就是說有明確的轉換規則,可以實現字元<->二進位的相互轉換。

這裡提到的轉換規則,其實就是我們常聽到的字元集&字元編碼。

字元集是一系列字元(文字、標點符號等)的集合。字元集有很多,常見的有ASCII、Unicode、GBK等。不同字元集主要的差異在於包含字元個數的不同。

了解了字元集的概念後,接下來介紹下字元編碼。

字符集告訴我們支援哪些字符,但具體字符怎麼編碼,是由字符編碼決定的。例如Unicode字元集,支援的字元編碼有UTF8(常用)、UTF16、UTF32。

概括一下:

  • 字元集:字元的集合,不同字元集包含的字元數不同。

  • 字元編碼:字元集中字元的實際編碼方式。

  • 一個字元集可能有多種字元編碼方式。

可以把字元編碼看成一個映射表,客戶端、服務端就是根據這個映射表,來實現字元跟二進位的編解碼轉換。

舉個例子,"你"這個字符,在UTF8編碼中,佔據三個字節0xe4 0xbd 0xa0,而在GBK編碼中,佔據兩個字節0xc4 0xe3。

字元編解碼範例

上面已經提到了字元編解碼所需的基礎知識。下面我們來看一個簡單的例子,這裡藉助了icon-lite這個函式庫來幫助我們實作編解碼的操作。

可以看到,當字元編碼時,我們採用了gbk。在解碼時,如果同樣採用gbk,可以得到原始的字元。而當我們解碼時採用utf8時,則出現了亂碼。


var iconv = require(&#39;iconv-lite&#39;);

var oriText = &#39;你&#39;;

var encodedBuff = iconv.encode(oriText, &#39;gbk&#39;);
console.log(encodedBuff);
// <Buffer c4 e3>

var decodedText = iconv.decode(encodedBuff, &#39;gbk&#39;);
console.log(decodedText);
// 你

var wrongText = iconv.decode(encodedBuff, &#39;utf8&#39;);
console.log(wrongText);
// ��
登入後複製

實際範例:服務端編解碼

通常我們需要處理編解碼的場景有檔案讀寫、網路請求處理。這裡距網路請求的例子,介紹如何在服務端進行編解碼。

假設我們執行以下http服務,監聽來自客戶端的請求。客戶端傳輸資料時採用了

gbk編碼,而服務端預設採用的是utf8編碼。

如果此時採用預設的

utf8對請求進行解碼,就會出現亂碼,因此需要特殊處理。

服務端程式碼如下(為簡化程式碼,這裡跳過了請求方法、請求編碼的判斷)


var http = require(&#39;http&#39;);
var iconv = require(&#39;iconv-lite&#39;);

// 假设客户端采用post方法,编码为gbk
var server = http.createServer(function (req, res) {
  var chunks = [];
  
  req.on(&#39;data&#39;, function (chunk) {
    chunks.push(chunk)
  });

  req.on(&#39;end&#39;, function () {
    chunks = Buffer.concat(chunks);

    // 对二进制进行解码
    var body = iconv.decode(chunks, &#39;gbk&#39;);
    console.log(body);

    res.end(&#39;HELLO FROM SERVER&#39;);
  });

});

server.listen(3000);
登入後複製

對應的客戶端程式碼如下:


var http = require(&#39;http&#39;);
var iconv = require(&#39;iconv-lite&#39;);

var charset = &#39;gbk&#39;;

// 对字符"你"进行编码
var reqBuff = iconv.encode(&#39;你&#39;, charset);

var options = {
  hostname: &#39;127.0.0.1&#39;,
  port: &#39;3000&#39;,
  path: &#39;/&#39;,
  method: &#39;POST&#39;,
  headers: {
    &#39;Content-Type&#39;: &#39;text/plain&#39;,
    &#39;Content-Encoding&#39;: &#39;identity&#39;,
    &#39;Charset&#39;: charset // 设置请求字符集编码
  }
};

var client = http.request(options, function(res) {
  res.pipe(process.stdout);
});

client.end(reqBuff);
登入後複製

以上是Nodejs中服務端字元編解碼與亂碼處理方法介紹的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它們
1 個月前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

nodejs是後端框架嗎 nodejs是後端框架嗎 Apr 21, 2024 am 05:09 AM

Node.js 可作為後端框架使用,因為它提供高效能、可擴展性、跨平台支援、豐富的生態系統和易於開發等功能。

nodejs怎麼連接mysql資料庫 nodejs怎麼連接mysql資料庫 Apr 21, 2024 am 06:13 AM

要連接 MySQL 資料庫,需要遵循以下步驟:安裝 mysql2 驅動程式。使用 mysql2.createConnection() 建立連接對象,其中包含主機位址、連接埠、使用者名稱、密碼和資料庫名稱。使用 connection.query() 執行查詢。最後使用 connection.end() 結束連線。

nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 nodejs安裝目錄裡的npm與npm.cmd檔有什麼差別 Apr 21, 2024 am 05:18 AM

Node.js 安裝目錄中有兩個與 npm 相關的文件:npm 和 npm.cmd,區別如下:擴展名不同:npm 是可執行文件,npm.cmd 是命令視窗快捷方式。 Windows 使用者:npm.cmd 可以在命令提示字元中使用,npm 只能從命令列執行。相容性:npm.cmd 特定於 Windows 系統,npm 跨平台可用。使用建議:Windows 使用者使用 npm.cmd,其他作業系統使用 npm。

nodejs中的全域變數有哪些 nodejs中的全域變數有哪些 Apr 21, 2024 am 04:54 AM

Node.js 中存在以下全域變數:全域物件:global核心模組:process、console、require執行階段環境變數:__dirname、__filename、__line、__column常數:undefined、null、NaN、Infinity、-Infinity

nodejs和java的差別大嗎 nodejs和java的差別大嗎 Apr 21, 2024 am 06:12 AM

Node.js 和 Java 的主要差異在於設計和特性:事件驅動與執行緒驅動:Node.js 基於事件驅動,Java 基於執行緒驅動。單執行緒與多執行緒:Node.js 使用單執行緒事件循環,Java 使用多執行緒架構。執行時間環境:Node.js 在 V8 JavaScript 引擎上運行,而 Java 在 JVM 上運行。語法:Node.js 使用 JavaScript 語法,而 Java 使用 Java 語法。用途:Node.js 適用於 I/O 密集型任務,而 Java 適用於大型企業應用程式。

nodejs是後端開發語言嗎 nodejs是後端開發語言嗎 Apr 21, 2024 am 05:09 AM

是的,Node.js 是一種後端開發語言。它用於後端開發,包括處理伺服器端業務邏輯、管理資料庫連接和提供 API。

nodejs專案怎麼部署到伺服器 nodejs專案怎麼部署到伺服器 Apr 21, 2024 am 04:40 AM

Node.js 專案的伺服器部署步驟:準備部署環境:取得伺服器存取權限、安裝 Node.js、設定 Git 儲存庫。建置應用程式:使用 npm run build 產生可部署程式碼和相依性。上傳程式碼到伺服器:透過 Git 或檔案傳輸協定。安裝依賴項:SSH 登入伺服器並使用 npm install 安裝應用程式相依性。啟動應用程式:使用 node index.js 等命令啟動應用程序,或使用 pm2 等進程管理器。設定反向代理(可選):使用 Nginx 或 Apache 等反向代理路由流量到應用程式

nodejs和java選哪個 nodejs和java選哪個 Apr 21, 2024 am 04:40 AM

Node.js 和 Java 在 Web 開發中各有優劣,因此選擇取決於專案需求。 Node.js 擅長即時應用程式、快速開發和微服務架構,而 Java 則在企業級支援、效能和安全性方面佔優。

See all articles