Как убедиться, что мой созданный файл для скачивания - UTF-8?(а не UTF-8 без спецификации) - PullRequest
8 голосов
/ 26 ноября 2010

Я сделал функцию загрузки для загрузки сообщений в файл CSV (код ниже).Теперь, когда я открываю его в блокноте или блокноте ++, я вижу это:

é NY ø ╬ ║► ░ ê ö

(и это то, что находится в базе данных между прочим)

Теперь, когда я открываю его в MS-Excel, он показывает это:

à © NY ø â • ¬ â • 'â – º â–' ê ö

КогдаЯ открываю его в Notepad ++, он говорит, что он закодирован в «UTF8 без спецификации».Когда я кодирую его (в блокноте ++) в UTF-8, все идет хорошо (то есть Excel также показывает правильные символы)

Но как я могу убедиться, что файл, который я создаю из моего кодатакое UTF-8?

Это мой код:

public ActionResult DownloadPersonalMessages()
{    
    StringBuilder myCsv = new StringBuilder();
    myCsv.Append(new DownloadService().GetPersonalMessages());

    this.Response.ContentType = "text/csv";
    Response.AddHeader("content-disposition", "attachment; filename=PersonalMessages.csv");
    Response.ContentEncoding = Encoding.UTF8;
    Response.Write(myCsv.ToString());
    Response.Flush();
    Response.HeaderEncoding = Encoding.UTF8;
    return Content("");
}

Редактировать:

моя функция теперь возвращает ByteArrayс этим преобразованием

UTF8Encoding encoding = new UTF8Encoding();
return encoding.GetBytes(str);

и моя загрузка теперь такая:

Response.AddHeader("Content-Disposition", "attachment; filename=PersonalMessages.csv");
return File(new DownloadService().GetPersonalMessages(), "text/csv");

Ответы [ 3 ]

21 голосов
/ 09 июля 2012

Ответ Зарета помог ОП, но фактически не ответил на вопрос.Вот правильное решение, начиная с этого другого поста :

public ActionResult Download()
{
    var data = Encoding.UTF8.GetBytes("some data");
    var result = Encoding.UTF8.GetPreamble().Concat(data).ToArray();
    return File(result, "application/csv", "foo.csv");
}

Метка порядка байтов (хотя технически не требуется для UTF8) подсказывает определенные программы (например, Excel> 2007) вТот факт, что вы используете UTF8.Вы должны вручную включить его с помощью метода GetPreamble().

4 голосов
/ 26 ноября 2010

Возможно, вы захотите использовать класс UTF8Encoding .У конструктора есть параметр, который определяет, должна ли она предоставлять спецификацию или нет.Возможно, вам придется использовать метод GetBytes и записать строку в виде последовательности байтов в ответе, а не преобразовывать ее обратно в строковый объект .net.

1 голос
/ 26 ноября 2010

Вы могли бы немного упростить свой код:

public ActionResult DownloadPersonalMessages()
{
    StringBuilder myCsv = new StringBuilder();
    myCsv.Append(new DownloadService().GetPersonalMessages());
    Response.AddHeader("Content-Disposition", "attachment; filename=PersonalMessages.csv");
    return File(Encoding.UTF8.GetBytes(myCsv.ToString()), "text/csv");
}

Что касается кодировки UTF-8, я боюсь, что проблема может быть в этом GetPersonalMessages методе.Возможно, вам потребуется вернуть поток или байтовый массив, который вы можете напрямую вернуть в виде файла.

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