Вопрос по response.write, response, encoding, asp.net – Как добавить информацию о кодировке в поток ответов в ASP.NET?

14

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

<code>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("ąęćżźń󳥌ŻŹĆŃŁÓĘ");
}
</code>

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

In Notepad2 - everything is fine. In Word - conversion wizard opens and asks to convert the text. It suggest UTF-8, which is somehow ok. In Excel - I get real mess. None of those Polish characters can be displayed.

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

<code>context.Response.Write((char)0xef);
context.Response.Write((char)0xbb);
context.Response.Write((char)0xbf);
</code>

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

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

Ваш Ответ

4   ответа
1

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

Context.Response.Write(""c)
Необходимо убедиться, что то, что слева, рассматривается как символ, а не как строка. Посмотри пожалуйстаstackoverflow.com/a/19522767/251674
Можете ли вы объяснить этот синтаксис? Я не знаком с этим
2

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

17

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

context.Response.BinaryWrite(System.Text.Encoding.UTF8.GetPreamble());
context.Response.Write("ąęćżźń󳥌ŻŹĆŃŁÓĘ");
это наиболее полезный ответ, поскольку каждая система кодирования и порядка байтов имеет различную преамбулу, и это относится к другим кодировкам.
Интересно, это примерно так же, как то, что происходит в ответе Алана Мура?
23

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

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

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

context.Response.Write('\uFEFF');
Спасибо! сэкономил много времени для меня!
большое спасибо! это именно то, что я искал. цель дескрипторов aphx состоит в том, чтобы просто создать дружественный список, и это делает свое дело! Greg

Похожие вопросы