Как добавить информацию о кодировании в поток ответов в ASP.NET?

У меня есть следующий код:

public void ProcessRequest (HttpContext context) 
{
    context.Response.ContentType = "text/rtf; charset=UTF-8";
    context.Response.Charset = "UTF-8";
    context.Response.ContentEncoding = System.Text.Encoding.UTF8;
    context.Response.AddHeader("Content-disposition", "attachment;filename=lista_obecnosci.csv");
    context.Response.Write("ąęćżźńółĄŚŻŹĆŃŁÓĘ");
}

Когда я пытаюсь открыть сгенерированный файл csv, я получаю следующее поведение:

  • В Notepad2 - все в порядке.
  • В окне мастера Word-преобразования открывается запрос на преобразование текста. Он предлагает UTF-8, который как-то нормально.
  • В Excel - я получаю настоящий беспорядок. Ни один из этих польских символов не отображается.

Я хотел написать эти специальные символы кодировки перед моей строкой, т.е.

context.Response.Write((char)0xef);
context.Response.Write((char)0xbb);
context.Response.Write((char)0xbf);

но это не принесет пользы. Поток ответа обрабатывает это как обычные данные и преобразует его в нечто иное.

Буду признателен за помощь в этом.

Ответы

Ответ 1

То, что вы называете "кодирование-информация", на самом деле является спецификацией. Я подозреваю, что каждый из этих "символов" получает кодировку отдельно. Чтобы написать спецификацию вручную, вы должны записать ее как три байта, а не три символа. Я не знаком с классами ввода/вывода .NET, но должен быть доступный вам метод, который принимает байтовый или байтовый параметр [] и записывает их непосредственно в файл.

Кстати, спецификация UTF-8 является необязательной; на самом деле его использование не приветствуется Консорциумом Юникод. Если у вас нет конкретной причины для его использования, избавьте себя от хлопот и оставьте это.

EDIT: Я просто вспомнил, что вы также можете написать фактический символ спецификации, '\uFEFF', и пусть кодер обрабатывает его:

context.Response.Write('\uFEFF');

Ответ 2

Я столкнулся с той же проблемой, и это было моим решением:

context.Response.BinaryWrite(System.Text.Encoding.UTF8.GetPreamble());
context.Response.Write("ąęćżźńółĄŚŻŹĆŃŁÓĘ");

Ответ 3

Я думаю, что проблема связана с Excel на основе Microsoft Excel управляет Diacritics в CSV файлах. Чтобы доказать это, скопируйте свою примерную строку вывода ąęćżźńółĄŚŻŹĆŃŁÓĘ и вставьте в тестовый файл, используя ваш любимый редактор, и сохраните его в виде файла CSV с кодировкой UTF-8. Откройте в Excel и посмотрите те же проблемы.

Ответ 4

Ответ от Алан Мур переведен на VB:

Context.Response.Write(""c)