しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Visual Studio で Azure Functions を作成すると文字化けする問題を EditorConfig で直す

Visual Studio や Azure Functions Core Tools などで新しい Azure Functions を作成すると、一般的な C# クラスとは異なり UTF-8 BOM 無しのファイルが生成されます。

UTF-8 BOM が必要なのかどうかは議論しませんが、C# では UTF-8 BOM が無いとマルチバイト圏の人間は困るようになっています。具体的には以下のように日本語を書いた時です。

f:id:shiba-yan:20200911025410p:plain

ファイルに UTF-8 BOM が付いていない場合、Visual Studio はデフォルトのエンコーディング、すなわち Shift_JIS として保存してしまいます。最悪な挙動ではあります。

f:id:shiba-yan:20200911025419p:plain

Git で差分を確認しようとすると、まともに表示されないので不便です。GitHub や Azure Repos などで確認した時にも文字化けが発生するので、結構困ります。

f:id:shiba-yan:20200911025523p:plain

全てを日本語の Windows 上で完結する場合には気が付きにくいですが、ビルドを GitHub Actions や Azure Pipelines を行っている場合には、デフォルトエンコーディングが異なるのでビルドしたバイナリに文字化けしたデータが含まれます。

この辺りは以前にぶちぞう RD が踏んで、ブログでブチギレていることで有名な挙動です。

これまで書いたように、Azure Functions のテンプレートが UTF-8 BOM 付きのファイルを生成しないのが根本原因ですが、Issue を上げても理解してもらえずにクローズされたので諦めています。

公式の対応が完全に期待できないので、ふと EditorConfig で強制できるのではないかと思って調べると、Visual Studio は charset に対応していました。

文字コードとしても utf-8-bom が使えるので、これを使ってファイルエンコーディングを強制します。

最低限の .editorconfig ファイルは以下のようなものを用意しました。これで *.cs ファイルは全て UTF-8 BOM として保存されるようになります。

# top-most EditorConfig file
root = true

[*.cs]
charset = utf-8-bom

作成した .editorconfig が読み込まれたことを確認し、適当に編集して保存すると UTF-8 BOM として保存されるので、Git の差分確認でも文字化けが発生しなくなります。

f:id:shiba-yan:20200911030213p:plain

一応ファイルエンコーディングを確認しておきます。ちゃんと UTF-8 BOM になっています。

f:id:shiba-yan:20200911030222p:plain

これで新しく作成した Function も常に UTF-8 BOM になるため、安心してコメントなどで日本語を使って書いていくことが出来るようになりました。

あまり関係ないですが、UTF-8 を Git でちゃんと扱うためには、環境変数 LANG の設定が必要です。

f:id:shiba-yan:20200911031835p:plain

EditorConfig はファイルエンコーディングだけだともったいないので、もっと本格的な定義を作成して一緒に入れておくのが良いです。自分は CoreFx などを参考にしてカスタマイズしたものを使っています。

暇な時に近代的な Azure Functions なプロジェクト構成を、テンプレとして作っておこうかと思いました。