Nodejsステップ:サービスエンド文字コード復号&文字化処理
3820 ワード
前に書く
webサービス開発では、文字のデコードはほぼ毎日のように行われています.デコードが不適切に処理されると、頭を悩ます文字化けの問題が発生します.
nodeのサービス開発に従事する多くの学生は、文字コードに関する知識が足りないため、問題が発生した時には、いつも手が足が出なくなり、大量の時間をかけて検査、問題を解決しています.
文字コードの復号化の基礎知識を簡単に紹介し、nodeで復号する方法を例に挙げて説明します.最後はサービスエンドのコード事例です.本明細書の関連コードの例はここで見つけることができる.
文字コーデックについて
ネットワーク通信の過程では、伝送のビットはすべてバイナリであり、送信の内容がテキストであろうと、写真であろうと、採用された言語は中国語であろうと、英語であろうと.
例を挙げて、クライアントはサービスに「こんにちは」を送ります.
お客様、こんにちは.
この中には二つのキーステップが含まれています.それぞれ対応するのは符号化、復号です.クライアント:「こんにちは」という文字列をコンピュータネットワークに必要なバイナリビットにエンコードします. サービス端末:受信したバイナリビットを、「こんにちは」という文字列に復号します. まとめてみます符号化:転送が必要なデータを対応するバイナリビットに変換する. 復号:バイナリビットを元のデータに変換する. 上のいくつかの重要な技術の詳細は言及していません.答えは次のセクションにあります.クライアントはどうやって「こんにちは」という文字に対応するビット数が分かりますか? サービス端末でバイナリビットビットを受信した後、対応する文字列はどう分かりますか? 文字セットと文字コードについて
文字、バイナリの変換問題について述べました.両者が互いに変換できるということは、明確な変換ルールがあるということで、文字バイナリの相互変換が可能となります.
ここで言う変換規則は、実はよく耳にする文字セットと文字コードです.
文字セットは一連の文字(文字、句読点など)の集合です.キャラクターセットはたくさんあります.よくあるのはASCII、Unicode、GBKなどです.異なる文字セットの主な違いは、文字の個数の違いです.
文字セットの概念を理解したら、次に文字コードを紹介します.
文字セットはどの文字をサポートしているかを教えてくれますが、具体的な文字はどのようにコード化されていますか?例えば、Unicode文字セットは、UTF 8、UTF 16、UTF 32がサポートされています.
まとめてみます文字セット:文字のセット、異なる文字セットに含まれる文字数が異なります. 文字コード:文字セット文字の実際の符号化方式. の1つの文字セットには、複数の文字コードがあります. 文字コードをマッピングテーブルとして見ることができます.クライアント、サーバーはこのマッピングテーブルに基づいて、文字とバイナリのデコード変換を実現します.
例えば、「あなた」という文字は、UTF 8符号化では、3バイトの
文字コーデック例
以上、文字の復号化に必要な基礎知識について述べました.以下では簡単な例を見て、ここでは
文字コードには
通常、私たちは復号化を処理する必要があります.ファイルの読み書き、ネットワークの要求処理があります.ここでは、ネットワーク要求の例から、サービス端末でのデコード方法を紹介します.
下記のhttpサービスを実行していると仮定して、クライアントからの要求を監督します.クライアントがデータを伝送するときは
この場合、デフォルトの
サービスエンドコードは以下の通りです.(コードを簡略化するために、要求方法、要求符号化の判断をスキップしました.)
Nodejs学習ノートhttps://github.com/chyingp/nodejs-learning-guide
iconv-litehttps://github.com/ashtuchkin/iconv-lite
webサービス開発では、文字のデコードはほぼ毎日のように行われています.デコードが不適切に処理されると、頭を悩ます文字化けの問題が発生します.
nodeのサービス開発に従事する多くの学生は、文字コードに関する知識が足りないため、問題が発生した時には、いつも手が足が出なくなり、大量の時間をかけて検査、問題を解決しています.
文字コードの復号化の基礎知識を簡単に紹介し、nodeで復号する方法を例に挙げて説明します.最後はサービスエンドのコード事例です.本明細書の関連コードの例はここで見つけることができる.
文字コーデックについて
ネットワーク通信の過程では、伝送のビットはすべてバイナリであり、送信の内容がテキストであろうと、写真であろうと、採用された言語は中国語であろうと、英語であろうと.
例を挙げて、クライアントはサービスに「こんにちは」を送ります.
お客様、こんにちは.
この中には二つのキーステップが含まれています.それぞれ対応するのは符号化、復号です.
文字、バイナリの変換問題について述べました.両者が互いに変換できるということは、明確な変換ルールがあるということで、文字バイナリの相互変換が可能となります.
ここで言う変換規則は、実はよく耳にする文字セットと文字コードです.
文字セットは一連の文字(文字、句読点など)の集合です.キャラクターセットはたくさんあります.よくあるのはASCII、Unicode、GBKなどです.異なる文字セットの主な違いは、文字の個数の違いです.
文字セットの概念を理解したら、次に文字コードを紹介します.
文字セットはどの文字をサポートしているかを教えてくれますが、具体的な文字はどのようにコード化されていますか?例えば、Unicode文字セットは、UTF 8、UTF 16、UTF 32がサポートされています.
まとめてみます
例えば、「あなた」という文字は、UTF 8符号化では、3バイトの
0xe4 0xbd 0xa0
を占め、GBK符号化では、2バイトの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
を用いて要求を復号すると、文字化けが発生するため、特殊な処理が必要となる.サービスエンドコードは以下の通りです.(コードを簡略化するために、要求方法、要求符号化の判断をスキップしました.)
var http = require('http');
var iconv = require('iconv-lite');
// post , gbk
var server = http.createServer(function (req, res) {
var chunks = [];
req.on('data', function (chunk) {
chunks.push(chunk)
});
req.on('end', function () {
chunks = Buffer.concat(chunks);
//
var body = iconv.decode(chunks, 'gbk');
console.log(body);
res.end('HELLO FROM SERVER');
});
});
server.listen(3000);
対応するクライアントコードは以下の通りです.var http = require('http');
var iconv = require('iconv-lite');
var charset = 'gbk';
// " "
var reqBuff = iconv.encode(' ', charset);
var options = {
hostname: '127.0.0.1',
port: '3000',
path: '/',
method: 'POST',
headers: {
'Content-Type': 'text/plain',
'Content-Encoding': 'identity',
'Charset': charset //
}
};
var client = http.request(options, function(res) {
res.pipe(process.stdout);
});
client.end(reqBuff);
関連リンクNodejs学習ノートhttps://github.com/chyingp/nodejs-learning-guide
iconv-litehttps://github.com/ashtuchkin/iconv-lite