環境
node.js v16.14
Ubuntu 20.4
はじめに
Node.jsでテキストファイルを読み込む場合、読み込み元ファイルの文字コードが、UTF-8以外のとき、全角日本語が文字化けすることになります。テキストファイルを読み込んだ後、ファイルの文字コードを判断できないだろうかと思って、調べていたところ、jschardetというライブラリを見つけたため、試してみることにした。
解説
用意したテキストファイルは以下の4種類です。4種類のファイルの読み込みは、関数の引数で判断させています。
- UTF-8
- UTF-16
- UTF-16BE
- S-JIS
ファイルの文字コードが、UTF-8以外であった場合、エラーと判断してコンソールログを表示します。
jschardet.detectに読み込んだファイルの内容を文字列で渡すと、encodingとconfidenceの2つのキーを持つ連想配列を返します。encodeingはライブラリが判断した文字列がセットされ、confidenceにはライブラリーが判断した文字コードの正確さ加減がセットされます。confidenceが1を返せば、結果は100%正しいと判断できますが、1以下を返せば、精度はどこまで信用できるか・・・という話になります。
ライブラリのインストール
jschardetは、npmでインストールします。
$npm install jschardet
コード
node.js
function check_file(flg) {
var fs = require('fs'), fd;
var jschardet = require('jschardet');
var filnm = ["sample_utf8", "sample_utf16", "sample_utf16be", "sample_sjis"];
var file = __dirname + "/端末ID/" + filnm[flg] + ".txt";
var text = fs.readFileSync(file);
// 文字コードがUTF-8(ascii)以外であればエラーにする
if (jschardet.detect(text).encoding != "ascii") {
let msg1;
msg1 = "ファイルの文字コードがUTF8でないため開くことができません。" + "\n";
msg1 += "ファイルの文字コードは、" + jschardet.detect(text).encoding + "です。";
console.log(msg1);
let msg2;
msg2 = jschardet.detect(text);
console.log(msg2);
return;
}
console.log("OK! ファイルは、" + jschardet.detect(text).encoding + "です。");
}