我的问题是,当我想将字符串转换为字节数组时,特殊字母转换失败。
赞:
在字符串中: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编码。
答案 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 ,并使一切正常工作。