問題 §
.NET Core/5/6でSystem.Text.Encoding.DefaultがシフトJISではなくUTF8を返す
原因 §
仕様 (.NET Coreによる破壊的な仕様変更)
解決 §
System.Text.Encoding.Defaultを使用しないでエンコーディングを取得する。
以下の手順で行う。
- Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);を事前に呼び出しておく。
- ソースに"[DllImport("kernel32.dll")][ResourceExposure(ResourceScope.None)]internal static extern int GetACP();"を入れてP/Invoke経由でWindows APIのGetACPを呼べるようにしておく
- System.Text.Encoding.Defaultの代わりにSystem.Text.Encoding.GetEncoding(GetACP());でエンコーディングを取得する
補足 §
GetACP()はWindowsのANSI code page(ACP)を取得する。つまり、Unicode前のレガシーな文字エンコーディングの情報を取得する。これは、基本的にSystem.Text.Encoding.Defaultで取得できる情報をイコールになる(はず)である。
これは現在のプログラミングではほぼ不要の情報だが、一部の機能(例、cmd.exe)などはこの情報で動作している。それらと互換を取るには必要となる。