Nodejsステップ:サービスエンド文字コード復号&文字化処理

3820 ワード

前に書く
webサービス開発では、文字のデコードはほぼ毎日のように行われています.デコードが不適切に処理されると、頭を悩ます文字化けの問題が発生します.
nodeのサービス開発に従事する多くの学生は、文字コードに関する知識が足りないため、問題が発生した時には、いつも手が足が出なくなり、大量の時間をかけて検査、問題を解決しています.
文字コードの復号化の基礎知識を簡単に紹介し、nodeで復号する方法を例に挙げて説明します.最後はサービスエンドのコード事例です.本明細書の関連コードの例はここで見つけることができる.
文字コーデックについて
ネットワーク通信の過程では、伝送のビットはすべてバイナリであり、送信の内容がテキストであろうと、写真であろうと、採用された言語は中国語であろうと、英語であろうと.
例を挙げて、クライアントはサービスに「こんにちは」を送ります.
お客様、こんにちは.
 この中には二つのキーステップが含まれています.それぞれ対応するのは符号化、復号です.
  • クライアント:「こんにちは」という文字列をコンピュータネットワークに必要なバイナリビットにエンコードします.
  • サービス端末:受信したバイナリビットを、「こんにちは」という文字列に復号します.
  • まとめてみます
  • 符号化:転送が必要なデータを対応するバイナリビットに変換する.
  • 復号:バイナリビットを元のデータに変換する.
  • 上のいくつかの重要な技術の詳細は言及していません.答えは次のセクションにあります.
  • クライアントはどうやって「こんにちは」という文字に対応するビット数が分かりますか?
  • サービス端末でバイナリビットビットを受信した後、対応する文字列はどう分かりますか?
  • 文字セットと文字コードについて
    文字、バイナリの変換問題について述べました.両者が互いに変換できるということは、明確な変換ルールがあるということで、文字バイナリの相互変換が可能となります.
    ここで言う変換規則は、実はよく耳にする文字セットと文字コードです.
    文字セットは一連の文字(文字、句読点など)の集合です.キャラクターセットはたくさんあります.よくあるのはASCII、Unicode、GBKなどです.異なる文字セットの主な違いは、文字の個数の違いです.
    文字セットの概念を理解したら、次に文字コードを紹介します.
    文字セットはどの文字をサポートしているかを教えてくれますが、具体的な文字はどのようにコード化されていますか?例えば、Unicode文字セットは、UTF 8、UTF 16、UTF 32がサポートされています.
    まとめてみます
  • 文字セット:文字のセット、異なる文字セットに含まれる文字数が異なります.
  • 文字コード:文字セット文字の実際の符号化方式.
  • の1つの文字セットには、複数の文字コードがあります.
  • 文字コードをマッピングテーブルとして見ることができます.クライアント、サーバーはこのマッピングテーブルに基づいて、文字とバイナリのデコード変換を実現します.
    例えば、「あなた」という文字は、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