◆ TextDecoder が使えるけど sjis は Full ICU データが必要
◆ UTF-8 以外の日本語などを扱うなら iconv-lite のほうが使い方揃ってていいかも

ときどきある sjis ファイルを読み込みたいとき iconv-lite を使って変換しています
考えてみると Node.js でも ブラウザ JavaScript と同じく TextDecoder があります
それなら別に iconv-lite なくていいんじゃない?と思って試してみました

const { execSync } = require("child_process")

try {
execSync("echo /?")
} catch (err) {
console.log("ERROR")
console.log("stdout:")
console.log(new TextDecoder("shift_jis").decode(err.stdout))
console.log("stderr:")
console.log(new TextDecoder("shift_jis").decode(err.stderr))
}

コマンドプロンプトの出力は sjis になってるので echo のヘルプメッセージを出すコマンドで受け取った stdout と stderr を sjis デコードして console.log します
やってみた結果は

RangeError [ERR_ENCODING_NOT_SUPPORTED]: The "shift_jis" encoding is not supported

サポートされてない……
ドキュメントを見たところ sjis には Full ICU Data が必要みたいです

Full ICU

ICU は Node.js のビルド時に指定してビルドするものみたいです
一般に公開されてるバイナリファイルでは full ICU でないビルドみたいです
使われない場合が多いのに重くなるので仕方ないのかも

Node.js のビルド それも自分で設定変えてなんて面倒だなーと思ってましたが Node.js の実行時に読み込むこともできるようです
Full ICU データは npm の full-icu パッケージで取得できるみたいなのでインストールしました

使い方はこんな感じ

node --icu-data-dir=node_modules\full-icu\icudt64l.dat script.js

ではさっそくさっきのプログラムを実行してみます

C:\tmp\js\00>node --icu-data-dir=node_modules\full-icu\icudt64l.dat echo-help.js
ERROR
stdout:
メッセージを表示したり、コマンド エコーの ON と OFF を切り替えます。

ECHO [ON | OFF]
ECHO [メッセージ]

現在のエコー設定を表示するには、パラメーターを指定せずに ECHO と入力してください。

stderr:

ちゃんと日本語になってますね
というか 「echo /?」 コマンドってエラー扱いかつ stdout にメッセージで stderr は空だったんですね

--icu-data-dir で指定する以外に NODE_ICU_DATA 環境変数にパス指定もできるので よく使うなら full-icu をグローバルインストールして環境変数にそのパスを設定しておくほうがいいかもです