2010-03-15 4 views
3

Я экспортировать таблицу данных в формат CSV, например:проблема ASP.NET CSV Excel со странными символами

"COL1","COL2","COL3" 
    "1","some text", "£232.00" 
    "2","some more text", "£111.00" 
    "3","other text", "£2.00" 

Код для экспорта довольно просто с помощью обработчика ASHx:

context.Response.Clear() 
    context.Response.ContentType = "text/csv" 
    context.Response.AddHeader("Content-disposition", "attachment;filename=data.csv") 
    context.Response.AddHeader("Cache-Control", "must-revalidate") 
    context.Response.AddHeader("Pragma", "must-revalidate") 
    context.Response.Write(data) 
    context.Response.Flush() 
    context.Response.End() 

Моя проблема заключается в том, что Excel пытается открыть экспортированный файл, который появляется перед всеми £ знаками, например £232.00, когда значение должно быть £232.00.

+1

Это выглядит как Unicode в UTF-8 ошибок перевода. Однако я не знаю, как это исправить. –

ответ

5

Вам необходимо установить кодировку, то есть свойство Response.ContentEncoding.

После наконец смотрит это в рефлектор, по умолчанию ContentEncoding, вероятно, будет Encoding.Default или Encoding.UTF8, если system.web/globalization конфигурационный раздел существует, если он не переопределен responseEncoding собственности в этой конфигурации раздела.

Что касается того, установка ContentEncoding собственности на все по-другому, чтобы не делать этого:

  • Если вы установите его в тот же объект, его текущей настройки, он явно улавливает, что и ничего не делает;
  • Однако, если вы измените настройку, она вызывает HttpWriter.UpdateResponseEncoding, которая вызывает HttpWriter.FlushCharBuffer, прежде чем переключиться на новую кодировку, если уже есть что-то буферизованное для записи.
  • Если вы не установили ContentEncoding, он установлен по умолчанию, о котором я упомянул выше, сначала ссылаясь на HttpWriter.UpdateResponseEncoding, который определенно вызывается до того, как будет написан какой-либо контент, потому что HttpWriter._responseEncodingUpdated проверяется способами записи и обновляется до True в конце HttpWriter.UpdateResponseEncoding.

Таким образом, я считаю, что OP необходимо изменить кодировку Unicode и я предполагаю, что комментарий Фила Хейла означает, что он был раздел system.web/globalization конфигурации, что необходимое переопределение.

Примечание:

  • Существующий код вызова Response.Clear влияет только содержание, а не заголовки, поэтому, в отличие от моего предыдущего предложения, я не считает, что это необходимо, кроме удаления каких-либо шансов на существующем содержимое, которое должно быть красным, перед изменением ContentEncoding.
  • Это основано на выходе рефлектора 6 от System.Web из .NET Framework 2.0.
+1

спасибо за советы, которые это разрешило. «context.Response.ContentEncoding = System.Text.Encoding.Unicode» – user23048345

+3

Я исправил это, добавив «Response.ContentEncoding = Encoding.Default;». Не совсем уверен, почему это работает честно –

0

Это работает для меня - другие не

Response.ContentEncoding = System.Text.Encoding.Default 
Смежные вопросы