如何在C#中使用é,á等特殊字符将字符串转换为字节数组?

时间:2019-12-20 11:58:39

标签: c# csv encoding

我的问题是,当我想将字符串转换为字节数组时,特殊字母转换失败。

赞:

  • 在字符串中:Városmajor

  • 在字节数组中:V�rosmajor

我的代码旨在从数据表中创建一个字符串,然后将其作为响应CSV文件发送。

public ActionResult DownloadCSV(int id)
{
    string res = provider.GetCSVtoDownload(id);
    byte[] buffer = Encoding.GetEncoding("ISO-8859-1").GetBytes(q);
    this.Response.Headers.Add("Content-Disposition", "attachment;data.csv");
    this.Response.ContentType = "text/csv";
    return File(buffer, "text/csv", "orderdata.csv");
}

public string GetCSVtoDownload(int id)
{
   var data = ctx.myDbSet.Find(id);
   var dt = new DataTable();

   dt.Columns.Add("id", typeof(int));
   dt.Columns.Add("name", typeof(string));

   object[] o = {
       data.id,
       data.name,
   };

   dt.Rows.Add(o);

   StringBuilder sb = new StringBuilder();
   IEnumerable<string> columnNames = dt.Columns.Cast<DataColumn>().
                                     Select(column => column.ColumnName);
   sb.AppendLine(string.Join(",", columnNames));

   foreach (DataRow row in dt.Rows)
   {
       IEnumerable<string> fields = row.ItemArray.Select(field => field.ToString());
       sb.AppendLine(string.Join(",", fields));
   }

   return sb.ToString();
}

我已经尝试过:UTF8和ASCII编码。

1 个答案:

答案 0 :(得分:2)

听起来这基本上是一个编码问题。

现实是,我们(程序员)对常规用户说谎已经有几十年了,并使他们认为存在“文本文件”之类的东西。这是不正确的;或过于简化。 “文本文件”仅表示二进制文件(实际上所有数据都是二进制文件),该文件恰好是用文本编码进行编码的,也就是说:如果您知道正确的编码,则可以通过编码运行二进制文件并获取正确的文字。

问题是:有很多编码,并且对于非国际英语范围内的基本字母数字字符,其中很多是完全可以互换的-所有代码页和UTF-8都在前128个代码点上一致。但是...然后变得凌乱,éá超出了该范围。

这里没有“正确”或“错误”的方式来编码此类字符-唯一相关的答案是“确保两端一致”,这可能意味着在工具中使用一些高级加载选项来选择编码。如有疑问,UTF-8应该几乎总是您的默认选择。如果需要额外的运气,您可以尝试在文件的开头包含UTF-8“ BOM”(new UTF8Encoding(true)可能有用,“ BOM”也称为“ preamble”)。或者,只需确保文件以字节xEF,0xBB,0xBF(即UTF-8“ BOM”)开头。许多工具可以识别“ BOM”,以帮助他们了解要使用哪种编码,因此,既然您提到了Excel,则可能 Excel可以识别“ BOM”并理解这是UTF-8 ,并使一切正常工作。