【node.js】jsでファイルの文字コードを自動で判別する

ファイルアップロードを実装した際に、文字コードを自動で判定してファイルの処理を行ったので、その時のソースコードを載せておきます。

node.jsを使い、実際に実装した環境はReactです。

準備

今回は文字コードの判別にencoding-japaneseというパッケージを使用するので、インストールします。

npm install —save encoding-japanese

文字コードを自動で判別し、String型でデータを返す関数

ソースコード

getFileData()は引数のfileオブジェクトの文字コードを自動で判別し、String型でデータを返す関数です。

import Encoding from 'encoding-japanese';

function getFileData(file) {
  let reader = new FileReader();
  reader.onload = function(e){
    try {
	
      // 文字コード判定、encodeにUTF8 or SJISが格納
      const codes = new Uint8Array(reader.result);
      const encode = Encoding.detect(codes);
	  
      // バイナリデータをUTF-8、String型の文字列に変換
      const convertData = Encoding.convert(codes, {
        to: 'unicode',
        from: encode,
        type: 'string',
      });

      return convertData;
	  
      /*
      convertData:ファイル内のデータをStringにして格納
      ここに任意の処理を書く (retrunの行は消す)
      */

    }
    catch (e) {
      console.error(e);
    }
  };
  // 入力ファイルをバイナリで読み込み
  reader.readAsArrayBuffer(file);
}

解説

まずfileオブジェクトの文字コードを判定するために、バイナリで読み込みます。

let reader = new FileReader();
reader.readAsArrayBuffer(file);

読み込んだバイナリデータを8ビット符号なし整数値の配列に変換し、そこから文字コードを取得します。

const codes = new Uint8Array(reader.result);
const encode = Encoding.detect(codes);

取得した文字コードのデータからUTF-8のString型のデータを生成します。

const convertData = Encoding.convert(codes, {
    to: 'unicode',
    from: encode,
    type: 'string',
});

あとはデータに任意の処理を加えて下さい。

今回は以下のサイトを参考にさせて頂きました。
https://qiita.com/takanorip/items/c0f54f133fc58c54b646