文字化け

普通に利用するとWindows上の場合、出力が文字化けしちゃいます。文字コードの問題だとは思うのですが、どうやっても化けたままなのでソースコードを覗いてみました。
原因
実行環境の文字コードからUTF-8に変換しようとしていたため。下記コードの9行目。
function spawn(command, outputChannel, args = [], options = {}) {
return new Promise((resolve, reject) => {
const stdout = "";
const stderr = "";
options.cwd = options.cwd || path.resolve(path.join(__dirname, ".."));
const child = childProcess.spawn(command, args, options);
let codepage = "65001";
if (os.platform() === "win32") {
codepage = childProcess.execSync("chcp").toString().split(":").pop().trim();
}
if (outputChannel) {
child.stdout.on("data", (data) => {
outputChannel.append(decodeData(data, codepage));
});
child.stderr.on("data", (data) => {
outputChannel.append(decodeData(data, codepage));
});
}
child.on("error", (error) => reject({ error, stderr, stdout }));
child.on("exit", (code) => {
if (code === 0) {
resolve({ code, stdout, stderr });
}
else {
reject({ code, stdout, stderr });
}
});
});
}
C:\Users\%username%\.vscode\extensions\vsciot-vscode.vscode-arduino-0.2.25\out\src\common\util.js
上記コードにて文字コードをUTF-8に設定しようとしているが、Windows環境の場合、子プロセスの文字コードを取得し、その文字コードに上書きする設定が入っている。
ここの設定にてShift_JISからUTF-8に変換しようとしているが、実際の出力はUTF-8で、更に変換をしようとしておかしくなっているみたいです。
if (os.platform() === "win32") {
//codepage = childProcess.execSync("chcp").toString().split(":").pop().trim();
}
なので該当部分をコメントアウトします。
修正結果

文字が正常に表示されました!
過去のチケットを見ていましたが、このへんはいろいろバタバタしているみたいでして、環境によって動きが違うみたいなので、コードに手を入れないと直らないみたいでした。
出力のエンコードをオプション化する提案などいろいろあったんですが、取り込まれていないようです。


コメント