クライアント側(ローカルPC側)だけでUTF8をSJISに変換出来るか?
結論から言うと、クライアント側のJqueryだけでSJISファイルを作成することは出来ませんでした。
正確には、encoding.jsのようなライブラリを使ってUTF-8をSJISに変換することは出来るようですが
外部のライブラリを使えない環境では、難しそうでした(見つけられなかっただけかも知れません)。
クライアント側で、外部ライブラリが使用出来ないので、サーバ側に入っていた「iconv-lite」を使ってUTF8からSJISに変換することにしました。
iconv-liteとは、Node.jsで文字エンコード変換を行うためのモジュールです
サーバ側(Node.js環境)でUTF8をSJISに変換する方法
サーバ側で変換する方法は、色々ありそうでしたが
今回は以下の方法で解決しました。
1.クラアント側:サーバ側へUTF8の文字列を送る。
2.サーバ側 :UTF8の文字列をSJISのBufferに変換する
:SJISのBuffer文字列をクライアント側に返す
3.クラアント側:サーバ側から受け取ったBuffer文字列(SJIS)を復元する
※イメージなので、このまま記載しても動きません。
クライアント側JS
$scope.fileDownload = function(){
let contextUtf8 = "日本語文字列";
service.utf8ToSjis(context).then(function (data){ // サーバ側にUTF8で送る
let context = data.contextSjis;
let byteArray = new Unit8Array(context); // 受け取ったBuffer文字列(SJIS)を元に戻す
let blob = new Blob([byteArray], {type: "text/plain"});
let link = document.createElement("a");
link.download = "download.txt";
link.href = (window.URL || window.webkitURL).createObjectURL(blob);
link.click();
link.remove();
}).catch(function(err) {
}).finally(function(){
});
}
サーバ側JS
const iconv = require('iconv-lite');
this.utf8ToSjis = function(context){
let contextSjis = iconv.encode(context, 'SJIS');
let result = {
contextSjis
}:
return result;
}