Как добавить информацию о кодировке в поток ответов в ASP.NET? - PullRequest
14 голосов
/ 17 июня 2009

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

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);

но это не поможет. Поток ответов обрабатывает эти данные как обычные данные и преобразует их во что-то другое.

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

Ответы [ 4 ]

23 голосов
/ 18 июня 2009

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

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

РЕДАКТИРОВАТЬ: Я только что вспомнил, что вы также можете написать фактическую спецификацию символ , '\uFEFF', и позволить кодировщику обработать это:

context.Response.Write('\uFEFF');
17 голосов
/ 19 сентября 2012

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

context.Response.BinaryWrite(System.Text.Encoding.UTF8.GetPreamble());
context.Response.Write("ąęćżźń󳥌ŻŹĆŃŁÓĘ");
2 голосов
/ 18 июня 2009

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

1 голос
/ 17 апреля 2012

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

Context.Response.Write(""c)
...