(просто) CSV скачать со специальными символами сводит меня с ума - PullRequest
7 голосов
/ 07 декабря 2010

этот сводит меня с ума.И на прошлой неделе я думал, что взломал орех, но, к сожалению, нет ....

, поэтому я хочу создать загрузку CSV для других пользователей, чтобы они открывались в MS-Word (они хотят формат CSV)

, поэтому я получаю следующий код в контроллере MVC2:

Response.AddHeader("Content-Disposition", "attachment; filename=PersonalMessages.csv");
Response.ContentType = "application/csv";
string s = new DownloadService().GetAddresses();
Response.Write(s);
Response.End();
return null;

строка 's' содержит (среди прочего) следующие символы: é å æ É à

Когда я открываю его в блокноте: OK

, когда я открываю его в Notepad ++: Ok

, когда я открываю его в Excel: не в порядке, он показывает это: à © à ¥ æ Ã101 Ã

(когда я открываю его в Notepadd ++, он говорит, что он находится в кодировке UTF8 без BOM, что бы я ни пытался использовать с кодировками UTF8 с логическими значениями в конструкторе, чтобы получить BOM, это не сработало;)

Итак, на прошлой неделе я задал вопрос, и ответ состоял в том, чтобы функция GetAddresses () возвращала байтовый массив.

Итак, я преобразовал свой текст, используя это:

// C# to convert a string to a byte array.
public static byte[] StrToByteArray(string str)
{
    System.Text.UnicodeEncoding encoding = new System.Text.UnicodeEncoding();
    return encoding.GetBytes(str);
}

, и написал байтовый массив в ответе и все было хорошо!Блокнот, блокнот ++ и Excel!Отлично, живи хорошо.

Но потом я узнал, что мы открываем файл в Word.Ну, нет проблем, я думал.

Но тогда они помогают: Word не может открыть файл (прямо), сначала запрашивает кодировку , и это проблема, потому что они используютэто в автоматизированном процессе.

Когда они открывают файл в Блокноте и сохраняют его как Unicode, все идет хорошо.

Я также попробовал это в методе действия:

Response.ContentEncoding = Encoding.Unicode ;
Response.HeaderEncoding = Encoding.UTF8;

но это не помогло.

У кого-нибудь есть подсказки?

Ответы [ 3 ]

16 голосов
/ 07 декабря 2010

Попробуйте использовать ISO-8859-1 вместо UTF-8:

public ActionResult Index()
{
    var encoding = Encoding.GetEncoding("iso-8859-1");
    var data = encoding.GetBytes("éåæÉà;some other value");
    return File(data, "application/csv", "PersonalMessages.csv");
}

Также обратите внимание на небольшое упрощение и использование FileResult.

Другая возможность, которую я бы порекомендовал вам, это явное добавление преамбулы, чтобы Excel мог распознавать кодировку UTF-8:

public ActionResult Index()
{
    var data = Encoding.UTF8.GetBytes("éåæÉà;some other value");
    var result = Encoding.UTF8.GetPreamble().Concat(data).ToArray();
    return File(result, "application/csv;charset=utf-8", "PersonalMessages.csv");
}
2 голосов
/ 22 декабря 2014

Я перепробовал много кодировок, одна из которых работает Windows-1252:

Response.Clear();
Response.ContentType = "Application/x-msexcel";
Response.AddHeader("content-disposition", "attachment; filename=\"filename.csv\"");
Response.ContentEncoding = System.Text.Encoding.GetEncoding("Windows-1252");
Response.Write(string.Join(Environment.NewLine, myDataLines));
Response.End();
2 голосов
/ 06 января 2012

Используйте ISO-8859-1 вместо UTF-8

Работает нормально.

Я пробовал в документе XLSX.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...