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;
}

この記事が気に入ったらサポートをしてみませんか?