ざっくりとコードを書いて、説明します。
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’などを指定して、取得するっていうのもありですね。
遥かに楽ですね。
文字コードがわからない人がユーザーなら、やはり自動変換かなあ。