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



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

喜欢:

  • 字符串: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 编码。

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

现实情况是,我们(程序员(几十年来一直对普通用户撒谎,让他们认为有"文本文件"这样的东西。这根本不是真的;或者这是一种严重的过度简化。"文本文件"只是意味着一个二进制文件(实际上所有数据都是二进制的(,它恰好用文本编码进行编码,也就是说:如果你知道正确的编码,你可以通过编码运行二进制文件并得到正确的文本。

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

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

最新更新