LoginSignup
0
0

More than 1 year has passed since last update.

テキストファイルの文字コードを変換する

Last updated at Posted at 2022-06-29

環境

Ubuntu 20.4 + Vagrant(Windows10)
Node.js v16.14.0

はじめに

テキストファイル(CSVファイルなど)の文字コードを判断して、S-JISであれば、UTF-8に変換する関数の紹介です。プラットフォームがWindows10であるため、Vagrant環境で動作しているUbuntuとファイルのやり取りがよく発生します。つまり、Windows環境で作成した、S-JISのファイルを、Ubuntu環境で扱うために、UTF-8にいちいち変換しなくてはいけないことになります。それを、Node.jsでサクッと行えるようにしたので、そのご紹介です。

解説

2つの外部ライブラリを使っています。jschardeticonv-liteです。この2つのライブラリは、npmで別途インストールする必要があります。jschardetはファイルの文字コードを判断するライブラリで、iconv-liteはファイルの文字コードを変換するライブラリです。

jschardetでファイルの文字コードを判断して、S-JISであれば、iconv-liteを使ってUTF-8に変換しています。

fsはテキストファイルを読み込んだり、書き込んだりするときに使われるライブラリです。Node.jsに標準で組み込まれているため、別途インストールする必要はありません。

引数には、変換対象のテキストファイルの保管場所をパス付で渡します。文字コードの変換は、S-JISからUTF-8への変換のみです。元々、UTF-8であった場合は、何も行わずスルーさせます。文字コードが、S-JIS、UTF-8以外であった場合は、エラーメッセージをコンソールに表示します。

文字コードの変換が行われた場合、ファイル名の末尾(拡張子の前)に「_utf」を付けた新しいファイルをUTF-8で作成します。

ファイルの文字コードがUTF-8の場合、jschardetは「UTF-8」で返す場合と「ascii」で返す場合とがあります。どちらにも対応できるようにしています。

コード

Node.js
function check_utf_file(file) {

    var fs = require('fs'), fd;
    var jschardet = require('jschardet');
    var iconv = require('iconv-lite');
    var msg, data;
    var filn = file.replace('.', '_utf.');
    var text = fs.readFileSync(file); 
   
    switch (jschardet.detect(text).encoding) {

        case "ascii": 
            return 0;
        case "UTF-8":
            return 0;
        case "SHIFT_JIS":
            fs.writeFileSync(filn, "");
            fd = fs.openSync(filn, "a");

            data = iconv.decode(text, 'ms932');
            fs.writeSync(fd, data, 0)
            fs.closeSync(fd);

            msg = "ファイルはS-JISです。UTF-8に変換したファイルを作成しました"
            console.log(msg);
            return 1;
        default:
            msg = "文字コードは" + jschardet.detect(text).encoding + "です。S-JISでもUTF-8でもない文字コードです"
            console.log(msg);
            return -1;
    }
}
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0