Как вывести файл в формате UTF8 с подписью в C# - PullRequest
0 голосов
/ 10 марта 2020

Я пытаюсь вывести файл Excel в виде вложения в ASP. NET, и его трудно кодировать в Turki sh. Следующие коды - то, что я сделал; Я оставляю строки, которые я пробовал в качестве комментариев:

  var collection = Data.Get<Students>()
    .Where(t => t.Year == activeYear)
    .OrderBy(t => t.Name);

  var total = collection.Count();

  DataTable dt = collection.ToDataTable();
  dt.Columns.Remove("Id");

  string htmlCode = "<table>";

  //add header row
  htmlCode += "<tr>";
  htmlCode += "<td>#</td>";

  for (int i = 0; i < dt.Columns.Count; i++)
  {
      htmlCode += "<td>" + dt.Columns[i].ColumnName + "</td>";
  }

  htmlCode += "</tr>";

  //add rows
  for (int i = 0; i < dt.Rows.Count; i++)
  {
    htmlCode += "<tr>";
    htmlCode += "<td>" + (dt.Rows.Count-i+1).ToString() + "</td>";

    for (int j = 0; j < dt.Columns.Count; j++)
    {
        htmlCode += "<td>" + dt.Rows[i][j].ToString() + "</td>";
    }

    htmlCode += "</tr>";
  }

  htmlCode += "</table>";   


  ////////////////////////////////////
  // Encoding part begins here
  ////////////////////////////////////

  var output = htmlCode;

  Encoding encoding =  new UTF8Encoding(true); //Encoding.UTF8; //new UTF8Encoding(true);
  var utf8bytes = encoding.GetBytes(output);
  utf8bytes = Encoding.UTF8.GetPreamble().Concat(utf8bytes).ToArray();
  byte[] bytes = new UTF8Encoding(true).GetBytes(output);
  //MemoryStream stream = new MemoryStream(utf8bytes);
  MemoryStream stream = new MemoryStream(bytes);

  StreamReader reader = new StreamReader(stream);

  Response.Clear();
  Response.Buffer = true;
  Response.ClearContent();

  string attachment = "attachment; filename=" + Utils.Security.RemoveDiacritics(currentLesson + "-" + activeYear) + ".xls";
  Response.AddHeader("content-disposition", attachment);
  //Response.ContentType = "application/octet-stream";
  Response.ContentType = "application/vnd.ms-excel";

  Response.ContentEncoding = new UTF8Encoding(true); //Encoding.GetEncoding("windows-1254"); // Encoding.UTF8;
  Response.Output.Write(reader.ReadToEnd());
  Response.Flush();
  Response.End();

Если я использую новое UTF8Encoding (true) или false, вывод всегда будет UTF8 без ПОДПИСИ. Если я открою файл в Notepad2 и закодирую его как UTF8 с подписью, имена будут отображаться правильно.

Это загруженный файл Excel, и в Excel неверное имя:

img

Это измененный файл Excel в Notepad2, и имя выглядит правильно в Excel:

enter image description here

Чтобы исправить Имена Я открываю скачанный файл xls с помощью Notepad2 и меняю кодировку с UTF8 на UTF8 с помощью Signature. Теперь, как я могу сделать это на стороне сервера?

Обновление: Разница между файлами показана ниже на скриншоте редактора HEX, всего 3 байта добавлено в начале плоского текстового файла xls:

enter image description here

1 Ответ

0 голосов
/ 10 марта 2020

Если вы хотите отправить список байтов с помощью utf-8 с bom, то вам следует записать три байта заголовка.

Вы можете записать три байта 0xEF,0xBB,0xBF в заголовок списка байтов, чтобы сделать список байтов в виде utf-8 с кодировкой bom

См. Порядок следования байтов - Википедия

...