Arduino for Visual Studio Code出力の文字化け対策

文字化け

普通に利用すると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();
        }

なので該当部分をコメントアウトします。

修正結果

文字が正常に表示されました!

過去のチケットを見ていましたが、このへんはいろいろバタバタしているみたいでして、環境によって動きが違うみたいなので、コードに手を入れないと直らないみたいでした。

出力のエンコードをオプション化する提案などいろいろあったんですが、取り込まれていないようです。

コメント