encoding.jsでSJIS変換してもcodeToStringメソッドがC2コードを勝手に挿入
const Encoding = require('encoding-japanese');
// 変換するために文字列を文字コード(10進数)配列に変換
// メソッド内部でString.charCodeAt() で置き換えているためunicodeになる。
// UNICODE は JavaScript の String.charCodeAt() の値を持つ配列です(ドキュメント抜粋)
const unicodeList = Encoding.stringToCode(changeBody);
// unicodeからSJISに変換
const shiftJisCodeList = Encoding.convert(unicodeList, 'sjis', 'unicode');
// 変換した配列をバイナリデータとして扱うために8 ビット符号なし配列に変換
const afString = new Uint8Array(shiftJisCodeList);
// バイナリデータを渡してCSVファイルに変換
const csvBlob = new Blob([afString], { type: 'text/csv' });
//あとは出力させるだけ
encoding.jsを入れて、Encoding.convertでSJIS変換しても、そのあとのEncoding.codeToStringで余分なC2コードが挿入され、SJISにならない。
じゃあ、Encoding.codeToStringを使わなければいいじゃんということで
// 文字コード配列を文字列に変換(連結)するらしいがC2が挿入されて使えない
const afString = Encoding.codeToString(shiftJisCodeList);
のかわりに
// 変換した配列をバイナリデータとして扱うために8 ビット符号なし配列に変換
const afString = new Uint8Array(shiftJisCodeList);
を使用することで無事解決。
ちなみにstringToCodeの中身は以下のコードなので出力結果はすべてunicodeということになる。
function stringToCode(string) {
var code = [];
var len = string && string.length;
for (var i = 0; i < len; i++) {
code[i] = string.charCodeAt(i);
}
return code;
}
この記事が気に入ったらサポートをしてみませんか?