Вопрос

У меня проблема с кодировкой UTF8 в моем приложении ASP.NET MVC 2 в C #. Я пытаюсь позволить пользователю загрузить простой текстовый файл из строки. Я пытаюсь получить массив BYTES со следующей линией:

var x = Encoding.UTF8.GetBytes(csvString);

Но когда я возвращаю его для загрузки, используя:

return File(x, ..., ...);

Я получаю файл, который без спецификации, поэтому я не получаю хорватских персонажей правильно. Это потому, что мой байт массив не включает в себя, после кодировки. Я тридерн вставляю эти байты вручную, а затем он появляется правильно, но это не лучший способ сделать это.

Я также попробовал создать экземпляр класса UTF8ENCODING и передачу логического значения (TRUE) к его конструктору, чтобы включить BOM, но он тоже не работает.

У кого-нибудь есть решение? Спасибо!

Это было полезно?

Решение

Попробуйте так:

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

Причина в том, что конструктор UTF8ENCODING, который принимает логический параметр, не делает то, что вы ожидаете:

byte[] bytes = new UTF8Encoding(true).GetBytes("a");

Полученный массив будет содержать один байт со значением 97. Нет BOM, потому что UTF8 не требует от BOM.

Другие советы

Я создал простое расширение для преобразования любой строки в любой кодировке в его представление байтового массива, когда он записывается в файл или поток:

public static class StreamExtensions
{
    public static byte[] ToBytes(this string value, Encoding encoding)
    {
        using (var stream = new MemoryStream())
        using (var sw = new StreamWriter(stream, encoding))
        {
            sw.Write(value);
            sw.Flush();
            return stream.ToArray();
        }
    }
}

Применение:

stringValue.ToBytes(Encoding.UTF8)

Это будет работать также для других кодировков, таких как UTF-16, который требует спецификации.

UTF-8 не требует спецификации, потому что это последовательность 1-байтовых слов. UTF-8 = UTF-8BE = UTF-8LE.

Напротив, UTF-16 требует отсчета в начале потока для определения того, является ли остаток потока UTF-16BE или UTF-16LE, потому что UTF-16 представляет собой последовательность 2-байтовных слов, и в спецификации идентифицируется Байты в словах являются или ле.

Проблема не лжет с Encoding.UTF8 сорт. Проблема лежит с любой программой, которую вы используете для просмотра файлов.

Помните, что .NET STRIONS все Unicode, пока там остается в памяти, поэтому, если вы можете правильно увидеть вашу CSVString с отладчиком, проблема написана файл.

На мой взгляд, вы должны вернуть FileResult с тем же кодированием, что файлы. Попробуйте установить возвратный кодировку файла,

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top