ホームページ ウェブフロントエンド jsチュートリアル Nodejsにおけるサーバーサイドの文字エンコード、デコード、文字化け処理方法の紹介

Nodejsにおけるサーバーサイドの文字エンコード、デコード、文字化け処理方法の紹介

Sep 05, 2017 am 09:48 AM
javascript nodejs 文字化け

この記事は、Nodejs の高度なサーバー側の文字エンコーディング、デコード、文字化け処理を主に紹介します。興味のある方は参考にしてください。

Web サーバーの開発では、文字エンコーディングが必要です。とデコードはほぼ毎日処理されます。エンコードとデコードを適切に処理しないと、厄介な文字化けが発生します。

ノードサーバー開発に携わる多くの学生は、文字エンコーディングコードの知識が不十分なために問題に遭遇したときに途方に暮れ、トラブルシューティングや問題解決に多くの時間を費やしてしまうことがよくあります。

このテキストでは、最初に文字のエンコードとデコードの基本知識を簡単に紹介し、次にノードでのエンコードとデコードの方法の例を示し、最後にサーバー側のコード例を示します。この記事に関連するコード例はここにあります。

文字のエンコードとデコードについて

ネットワーク通信の過程では、送信内容がテキストか画像か、使用言語が中国語か英語かにかかわらず、バイナリビットが送信されます。

たとえば、クライアントはサーバーに「Hello」を送信します。

クライアント --- こんにちは ---> サーバー

これには、エンコードとデコードに対応する 2 つの重要な手順が含まれています。

客户端 --- 你好 ---> 服务端

这中间包含了两个关键步骤,分别对应的是编码、解码。

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

1. クライアント: 文字列「Hello」をコンピュータ ネットワークに必要なバイナリ ビットにエンコードします。

2. サーバー: 受信したバイナリ ビットを文字列「Hello」にデコードします。

要約すると:

1. エンコーディング: 送信されるデータを対応するバイナリ ビットに変換します。

🎜2. デコード: バイナリビットを元のデータに変換します。 🎜🎜いくつかの重要な技術的な詳細は上では言及されていません。答えは次のセクションにあります。 🎜
  • 🎜クライアントは、文字「Hello」に対応するビット数をどのようにして知るのでしょうか? 🎜
  • 🎜サーバーがバイナリビットを受信した後、対応する文字列が何であるかをどのようにして知るのでしょうか? 🎜
🎜🎜文字セットと文字エンコーディングについて🎜🎜🎜文字とバイナリ変換の問題は上で述べました。この 2 つは相互に変換できるため、つまり明確な変換規則があり、文字 <-> はバイナリに変換できます。 🎜🎜ここで言及する変換ルールは、実際にはよく聞く文字セットと文字エンコーディングです。 🎜🎜文字セットは、文字 (テキスト、句読点など) のコレクションです。多くの文字セットがあり、一般的なものには ASCII、Unicode、GBK などが含まれます。異なる文字セットの主な違いは、含まれる文字の数です。 🎜🎜文字セットの概念を理解した後、文字エンコーディングを紹介しましょう。 🎜🎜どの文字がサポートされているかは文字セットによってわかりますが、特定の文字をエンコードする方法は文字エンコードによって決まります。たとえば、Unicode 文字セットは、UTF8 (一般的に使用される)、UTF16、UTF32 などの文字エンコーディングをサポートします。 🎜🎜要約すると: 🎜
  • 🎜文字セット: 異なる文字セットには異なる数の文字が含まれます。 🎜
  • 🎜文字エンコーディング: 文字セット内の文字の実際のエンコーディング。 🎜
  • 🎜 文字セットには複数の文字エンコード方式が含まれる場合があります。 🎜
🎜文字エンコーディングは、マッピング テーブルとみなすことができます。クライアントとサーバーは、このマッピング テーブルを使用して、文字とバイナリのエンコードとデコードの変換を実装します。 🎜🎜たとえば、文字「you」は、UTF8 エンコードでは 3 バイト 0xe4 0xbd 0xa0 を占め、GBK エンコードでは 2 バイト 0xc4 0xe3 を占めます。 🎜🎜🎜文字のエンコードとデコードの例🎜🎜🎜 文字のエンコードとデコードに必要な基礎知識は上記で説明しました。以下の簡単な例を見てみましょう。ここでは、icon-lite ライブラリを使用してエンコードおよびデコード操作の実装を支援します。 🎜🎜文字エンコード時にgbkを使用していることがわかります。デコードする際にはgbkも使用すると元の文字を取得できます。デコード時に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);
ログイン後にコピー
🎜🎜実際の例: サーバー側のエンコードとデコード🎜🎜🎜通常、エンコードとデコードを処理する必要があるシナリオには、ファイルの読み取りと書き込み、ネットワーク要求の処理が含まれます。ここではネットワーク リクエストの例を示し、サーバー側でエンコードおよびデコードする方法を紹介します。 🎜🎜次の http サービスを実行し、クライアントからのリクエストをリッスンしているとします。クライアントはデータ送信時に gbk エンコードを使用しますが、サーバーはデフォルトで utf8 エンコードを使用します。 🎜🎜このときデフォルトのutf8を使用してリクエストをデコードすると文字化けが発生するため、特別な処理が必要です。 🎜🎜サーバーコードは以下の通りです(コードを簡略化するため、ここではリクエストメソッドとリクエストエンコーディングの判断は省略しています)🎜🎜🎜🎜
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);
ログイン後にコピー
🎜対応するクライアントコードは以下の通りです: 🎜🎜🎜🎜rrreee

以上がNodejsにおけるサーバーサイドの文字エンコード、デコード、文字化け処理方法の紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

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のグローバル変数とは何ですか Nodejsのグローバル変数とは何ですか Apr 21, 2024 am 04:54 AM

Node.js には次のグローバル変数が存在します。 グローバル オブジェクト: グローバル コア モジュール: プロセス、コンソール、require ランタイム環境変数: __dirname、__filename、__line、__column 定数: unknown、null、NaN、Infinity、-Infinity

Nodejs インストール ディレクトリ内の npm ファイルと npm.cmd ファイルの違いは何ですか? Nodejs インストール ディレクトリ内の npm ファイルと npm.cmd ファイルの違いは何ですか? Apr 21, 2024 am 05:18 AM

Node.js インストール ディレクトリには、npm と npm.cmd という 2 つの npm 関連ファイルがあります。違いは次のとおりです。拡張子が異なります。npm は実行可能ファイルで、npm.cmd はコマンド ウィンドウのショートカットです。 Windows ユーザー: npm.cmd はコマンド プロンプトから使用できますが、npm はコマンド ラインからのみ実行できます。互換性: npm.cmd は Windows システムに固有ですが、npm はクロスプラットフォームで使用できます。使用上の推奨事項: Windows ユーザーは npm.cmd を使用し、他のオペレーティング システムは npm を使用します。

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とJavaのどちらを選択しますか? NodejsとJavaのどちらを選択しますか? Apr 21, 2024 am 04:40 AM

Web 開発において Node.js と Java にはそれぞれ長所と短所があり、どちらを選択するかはプロジェクトの要件によって異なります。 Node.js はリアルタイム アプリケーション、迅速な開発、マイクロサービス アーキテクチャに優れており、Java はエンタープライズ グレードのサポート、パフォーマンス、セキュリティに優れています。

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 などのリバース プロキシを使用して、トラフィックをアプリケーションにルーティングします。

See all articles