Как добавить информацию о кодировании в поток ответов в 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)