2015年5月3日日曜日

[Node.js] Shift_JISなレスポンスデータをUnicodeに変換する簡単な方法

今回紹介するのは、node.jsで Shift_JIS なWebサーバからのレスポンスをUnicode(JS内で扱える文字コード)に変換する最も簡単(?)な方法です。

今回のサンプルアプリで利用するnpmモジュールは、

"request": "^2.55.0",
"encoding-japanese": "^1.0.23"

これだけです。

package.json
{
  "name": "Example",
  "description": "SJISなデータをGETしてUNICODE(js文字コード)に返還するサンプル",
  "version": "0.0.1",
  "private": true,
  "dependencies": {
    "request": "^2.55.0",
    "encoding-japanese": "^1.0.23"
  }
}

server.js
var http = require('http');
var request = require('request');
var encoding = require('encoding-japanese');

http.createServer(function(req, res) {

  res.writeHead(200, {
    'Content-Type': 'text/plain'
  });

  // SJISなレスポンスを返すURL
  var url: 'http://ai.2ch.sc/newsalpha/dat/9990000001.dat';

  var requestSettings = {
    method: 'GET',
    url: url,
    encoding: null // レスポンスをバイナリデータとして取得
  };

  request(requestSettings, function(error, response, body) {
    
    // body にはバイナリデータ(Bufferオブジェクト)が格納されてくる

    // SJIS から UNICODE (JSが扱うコード) へ返還
    var unicodeArr = encoding.convert(body, {
      from: 'SJIS',
      to: 'UNICODE'
    });
    // UNICODEな文字列に変換
    // これでstrはJS上で普通の文字列として扱えるようになる
    var str = encoding.codeToString(unicodeArr);

    console.log(str);

    res.end('Hello World\n');
  });

}).listen(1337, '127.0.0.1');


console.log('Server running at http://127.0.0.1:1337/');

npmインストールしてからWebサーバを起動

$ npm install
$ node server.js

Webサーバが立ち上がったら http://127.0.0.1:1337/ をブラウザから叩いてみてください。
2chのSJISなDATデータが文字化けせずにコンソールログ出力されたと思います。

文字列をエンコードする方法なら他にも Iconv などのモジュールを利用する方法もあると思いますが、Shift_JIS→Unicodeの変換だけであれば今回紹介した方法が最もシンプルではないかと思っています。

最近はShift_JISを採用しているシステムもかなり珍しくなってきましたが、古いシステムだと未だ普通に使ってたりしますので、知っておくといつか役立つ時が来るかもしれませんね。

0 件のコメント:

コメントを投稿