Apache Cordovaのチュートリアルに沿ってコマンド打って出てくる文字化けがどうしても気になって何とかしようとした話

ここに書いてあるとおりhelloプロジェクトを作成。

> cordova requirements

開発環境をなんも整えてないのでnot installedとか注意がいっぱい出る。
その中で 'android' 〜〜〜 のところが文字化けして読めない。
意味はまあ「'android' ってコマンドは無いよ〜」ってやつだろうと容易に想像はついたものの、なんかすごい気になった。

調べたらNode.jsはUTF-8が基本だという話なので

> chcp 65001

変わらない。コンソールのせいではないらしい。

処理を追いかけてみると内部で execa というやつがいて、そいつがcmd.exeを呼んで /c 引数によって 'android' コマンドを実行している模様。

調べてみるとレジストリの HKEY_LOCAL_MACHINE\Software\Microsoft\Command Processor\AutoRun で文字列値 @chcp 65001>nul としておくとcmd.exe起動時にこのコマンドをやってくれるらしいので書いてみる。

変わらない。

処理をよく見るとcmd.exeの引数に /d を指定しており、これはレジストリのAutoRunを無効にするらしい。そりゃ変わらんわと外してみる。

変わらない。

そろそろ心が折れてくるが諦めない。よくよく読んでみると execa の中で独自にエラーを作っていたらしい。stderr という変数があやしい。console.dir で吐いてみたらやっぱりこいつだった。でも既に文字化けしているので、文字コード変換しようがない。
どこから来たのかと見てみたところ、execa/lib/stream.js の stderrPromise やらなんやらというあたりっぽい。
経験の浅い非同期処理とストリームを前にして調査はだいぶ困難を極めたものの、
getStreamPromise 関数内の
getStream(stream, {encoding, maxBuffer});
という記述を
getStream(stream.pipe(require('iconv-lite').decodeStream("Shift_JIS")), {encoding, maxBuffer});
に書き換えたら、文字化けがなおった!!

以上です。

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