Javascript 文字コードの自動変換


ざっくりとコードを書いて、説明します。

   var file = this.files[0];

      // FileReaderのインスタンスを作成
      var reader = new FileReader();

      // ファイルの読み込みが完了したときの処理
      reader.onload = function(e) {
        // ファイルの内容を取得
        var fileContent = e.target.result;
        fileContent=str2Array(fileContent);

        // 'fileContents' の文字コードを判定する
        var encoding = Encoding.detect(fileContent);

        // 文字コードを UNICODE に変換する
        fileContent = Encoding.convert(fileContent, {to: 'UNICODE', from: encoding});
        

        fileContent=Encoding.codeToString(fileContent);
      // ファイルを読み込む
      reader.readAsBinaryString(file);
    });

function str2Array(str) {
  // 空の配列を用意する
  var array = [];
  // 文字列の文字数だけ繰り返す
  for (var i = 0; i < str.length; i++) {
    // 文字列の i 番目の文字の文字コードを取得する
    var charCode = str.charCodeAt(i);
    // 配列に文字コードの値を追加する
    array.push(charCode);
  }
  // 配列を返す
  return array;
}

説明

まずは、ファイルをバイナリの文字列として読み込みます。
reader.readAsBinaryString(file);

次に、str2Arrayを使って、
文字列を受け取り、その文字列を文字コードの値の配列に変換する
文字一つ一つが、番号に変わるような変換です。
関数内で、
str.charCodeAt(i) メソッドを使って、文字列 str の i 番目の文字の文字コードを取得しています。

そして、文字コードを判定してから、UNICODEの文字コードの文字列に直します。

    // 'fileContents' の文字コードを判定する
    var encoding = Encoding.detect(fileContent);

    // 文字コードを UNICODE に変換する
    fileContent = Encoding.convert(fileContent, {to: 'UNICODE', from: encoding});

最後にUNICODEだったものを文字列(UTF-8)に変換しています。

Encodingのものは、ライブラリを利用しています。

元サイト
https://polygon-planet-log.blogspot.com/2012/04/javascript.html


参考にさせていただいたサイト
https://gunmagisgeek.com/blog/javascript/4525

こちらにも、サンプルがありますね。こちらが本家ですね。
本家サンプル やり方が違う


アップロードするファイルの文字コードを申請してもらえるなら、
readAsText()の第二引数に’Shift_JIS’などを指定して、取得するっていうのもありですね。
遥かに楽ですね。
文字コードがわからない人がユーザーなら、やはり自動変換かなあ。