ASP.NET Core C# ダウンロードしたCSVファイルをエクセルで開くと文字化けする場合の対処法
ASP.NET Core(C#)の環境で、CSVファイルのダウンロード機能を実装したとき、ダウンロードしたCSVファイルをエクセルで開くと文字化けする現象がありました。
CSVファイルの文字コードをUTF-8にしていると文字化けするようです。
対処法としては、文字コードをShift_JisもしくはUTF-8(BOM)にする方法があります。
ここではCSVをUTF-8(BOM)(BOMありのUTF-8)でダウンロードする方法を紹介します。
なお、CSVはASP.NET Core CSVファイルをダウンロードするWebAPIを作成するで紹介した方法でダウンロードしています。
UTF-8(BOM)の文字コードは以下のように取得できます。
var enc = new UTF8Encoding(true);しかし、以下のように文字コードをUTF-8(BOM)にするだけではうまくいきません。
string csv = "CSVデータ";
byte[] file = new UTF8Encoding(true).GetBytes(csv).ToArray(); // 文字列をバイト配列に変換する以下のようにGetPreambleでBOMを取得し、実際のデータと連結することにより、BOM付きのデータとなります。
string csv = "CSVデータ";
byte[] data = new UTF8Encoding(true).GetBytes(csv); // 文字列をバイト配列に変換する
// Excelで開いたときに文字化けしないようにBOMを追加する
byte[] file = new UTF8Encoding(true).GetPreamble().Concat(data).ToArray();WebAPIとしては以下のようになります。
[HttpGet("{id}/[action]")]
public async Task<IActionResult> Download(string id)
{
string csv = "CSVデータ";
byte[] file = Encoding.UTF8.GetBytes(csv).ToArray(); // 文字列をバイト配列に変換する
byte[] data = new UTF8Encoding(true).GetBytes(csv); // 文字列をバイト配列に変換する
// Excelで開いたときに文字化けしないようにBOMを追加する
byte[] file = new UTF8Encoding(true).GetPreamble().Concat(data).ToArray();
return File(file, "application/octet-stream", ファイル名);
}