TL;DR;
- 日本語Windowsでは
dotnet
コマンド出力がUTF-8のため文字化けする- 解決するには
chcp 65001
を実行してコンソールのコードページをUTF-8にする
- 解決するには
- VSCodeのタスク定義では
windows
としてWindows固有の設定ができる- そこに
chcp 65001
の後にdotnet
コマンドを実行するよう指定する
- そこに
何が問題か
.NET Coreなアプリ開発はVisual Studioはもちろん、Visual Studio Code(以下VSCode)が使われることも多くなってきたかと思います。
VSCodeはフルのVisual Studio(以下VS)が使えないmacOSやLinux Desktopでよく使われているイメージですが、WindowsでもVSに比べ動作が軽快ですし、デバッガもついていますので、ちょっとした開発では案外十分に機能します。
そこで問題となるのがタスクでdotnet
コマンドを実行した際、出力結果が文字化けすることです。dotnet
コマンドはUTF-8で標準出力等に出力するのですが、日本語Windowsの既定のエンコーディングが、MS932(いわゆるShift-JIS)であるため、ただそのまま実行しても文字化けしてしまうのです。
※参考 : dotnet coreで対応しているテキストエンコーディング | OPC Diary
その回避策としては、cmd.exeを実行時に自動でchcp 65001
(65001はUTF-8のコードページ)を実行するようレジストリをいじるといったこともできるようですが、このためだけにすべてのcmd.exeのコードページを変更するのは、正直嫌です。
※参考 : コマンドプロンプト起動時、自動的に文字コードをUTF-8にして日本語もちゃんと表示できるようにする方法 - Qiita
解決法
そこで、VSCodeのタスク定義のところで、Windowsの時だけdotnet
コマンドを実行するのではなく、cmd
を経由してchcp 65001
を実行した後にdotnet
コマンドを実行するようにしましょう。具体的には、既定のcommand
などを定義した後に、windows
の設定を追加します。
{
"version": "0.1.0",
"command": "dotnet",
"isShellCommand": true,
"args": [],
"windows": { // Windows固有の設定
"command": "cmd", // cmd.exeを実行
"args": [ "/C", "chcp 65001 && dotnet"] // /Cオプションで第二引数のコマンドを実行
}, // chcp 65001 の後に && で続けてdotnetを実行するよう指定
"tasks": [
{
"taskName": "build",
"args": [
],
"isBuildCommand": true,
"problemMatcher": "$msCompile"
},
]
}
※参考 : Custom Tasks - Tasks in Visual Studio Code
ビルドを実行すると、確かに文字化けが解消されていることが確認できます。
これであなたも快適な.NET Core開発 with VSCodeライフを!