環境
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つの外部ライブラリを使っています。jschardetとiconv-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」で返す場合とがあります。どちらにも対応できるようにしています。
コード
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;
}
}