gpt4 book ai didi

c# - Excel CSV 编码问题

转载 作者:行者123 更新时间:2023-12-02 03:28:36 25 4
gpt4 key购买 nike

我有关于丹麦语字符的问题,并在 Excel 中打开保存为 CSV 的文件。请参阅下面的代码:

        [HttpGet]
[Route("/progress/data.csv")]
[Produces("text/csv")]
public IActionResult GetCSV()
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("æø;2;3;");
Encoding encode = Encoding.UTF8;
return File(encode.GetBytes(sb.ToString()), "text/csv", "data.csv");
}

我使用的是 .NET Core 2.1,此导出的结果是前两个字符 æø 显示为 ª 。

我知道这是一个已知问题,但到目前为止我还没有找到解决方案。在过去的 4 个小时里,我尝试了至少 15 种不同的方法,包括带/不带 BOM 的 UTF。使用 System.Text.Encoding.UTF8.GetPreamble() 手动添加 BOM,各种 MemoryStream、StreamWriter 解决方案,尝试使用 windows-1252 和 CodePagesEncodingProvider.Instance.GetEncoding(1252) 但没有任何效果。当在 Excel 中打开此文件时,结果总是与预期不同。

谁有解决办法吗?

最佳答案

问题是Excel处理BOM的方式。您可能会发现使用 StreamWriter :

StreamWriter defaults to using an instance of UTF8Encoding unless specified otherwise. This instance of UTF8Encoding is constructed without a byte order mark (BOM), so its GetPreamble method returns an empty byte array. The default UTF-8 encoding for this constructor throws an exception on invalid bytes. This behavior is different from the behavior provided by the encoding object in the Encoding.UTF8 property. To specify a BOM and determine whether an exception is thrown on invalid bytes, use a constructor that accepts an encoding object as a parameter, such as StreamWriter(String, Boolean, Encoding) or StreamWriter.

所以我只是创建一个 IActionResult 的自定义实现:

public class Utf8ForExcelCsvResult : IActionResult
{
public string Content{get;set;}
public string ContentType{get;set;}
public string FileName {get;set;}
public Task ExecuteResultAsync(ActionContext context)
{
var Response =context.HttpContext.Response;
Response.Headers["Content-Type"] = this.ContentType;
Response.Headers["Content-Disposition"]=$"attachment; filename={this.FileName}; filename*=UTF-8''{this.FileName}";
using(var sw = new StreamWriter(Response.Body,System.Text.Encoding.UTF8)){
sw.Write(Content);
}
return Task.CompletedTask ;
}
}

当您需要使用 Excel 打开此类 csv 文件时,只需返回 Utf8ForExcelCsvResult 即可。

[HttpGet]
[Route("/progress/data.csv")]
[Produces("text/csv")]
public IActionResult MyFileDownload()
// public Utf8ForExcelCsvResult MyFileDownload()
{
StringBuilder sb = new StringBuilder();
sb.AppendLine("æø;2;3;");
sb.AppendLine("გამარჯობა");
sb.AppendLine("ဟယ်လို");
sb.AppendLine("ສະບາຍດີ");
sb.AppendLine("cześć");
sb.AppendLine("こんにちは");
sb.AppendLine("你好");
Console.WriteLine(sb.ToString());
return new Utf8ForExcelCsvResult(){
Content=sb.ToString(),
ContentType="text/csv",
FileName="hello.csv",
};
}

enter image description here

我们可以使用 Powershell 通过 Format-h​​ex -path .\hello.csv 检查 csv 文件的十六进制表示:

           00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000 EF BB BF C3 A6 C3 B8 3B 32 3B 33 3B 0D 0A E1 83 æø;2;3;..á
00000010 92 E1 83 90 E1 83 9B E1 83 90 E1 83 A0 E1 83 AF ááá á¯
00000020 E1 83 9D E1 83 91 E1 83 90 0D 0A E1 80 9F E1 80 ááá..áá
00000030 9A E1 80 BA E1 80 9C E1 80 AD E1 80 AF 0D 0A E0 áºáá­á¯..à
00000040 BA AA E0 BA B0 E0 BA 9A E0 BA B2 E0 BA 8D E0 BA ºªàº°àºàº²àºàº
00000050 94 E0 BA B5 0D 0A 63 7A 65 C5 9B C4 87 0D 0A E3 ີ..czeÅ..ã
00000060 81 93 E3 82 93 E3 81 AB E3 81 A1 E3 81 AF 0D 0A ãã«ã¡ã¯..
00000070 E4 BD A0 E5 A5 BD 0D 0A 你好..

这里前三个字节EF BB BFByte order marks

关于c# - Excel CSV 编码问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52491983/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com