文字化け
普通に利用すると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(); }
なので該当部分をコメントアウトします。
修正結果
文字が正常に表示されました!
過去のチケットを見ていましたが、このへんはいろいろバタバタしているみたいでして、環境によって動きが違うみたいなので、コードに手を入れないと直らないみたいでした。
出力のエンコードをオプション化する提案などいろいろあったんですが、取り込まれていないようです。
コメント