【问题标题】:How can i convert string to byte array in C# with special characters like é, á?如何在 C# 中使用 é、á 等特殊字符将字符串转换为字节数组?
【发布时间】:2019-12-20 11:58:39
【问题描述】:

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

喜欢:

  • 在字符串中: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?
  • 是的,我已经尝试过了
  • 问题:你认为应该输出什么字节?不同的编码/代码页有不同的字节序列,所以:选择是关键。除了“你所期望的”之外,没有“正确”的答案。那么:您希望éá 的字节序列是什么,表示为十六进制?例如,UTF-8 会分别表示 C3 A9 和 C3 A1
  • 你尝试过 Unicode 吗?
  • @useruser 等等...你的意思是在字节数组中?我认为这可能是字节数组下的预期行为?而你需要做的是解码这个字节数组? (不知道对不对)

标签: c# csv encoding


【解决方案1】:

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

现实情况是,我们(程序员)几十年来一直在欺骗普通用户,让他们认为存在“文本文件”这样的东西。这是不正确的;或者这是一个严重的过度简化。 “文本文件”只是指碰巧用文本编码编码的二进制文件(所有数据都是二进制文件),也就是说:如果你知道正确的编码,你可以通过编码运行二进制文件并得到正确的文本返回。

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

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

【讨论】:

    猜你喜欢
    • 2015-05-16
    • 2014-11-30
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-08
    • 2011-12-26
    • 1970-01-01
    相关资源
    最近更新 更多