Действие Web API возвращает FileContentResult, который, если он сохранен как .csv, будет отображаться как тарабарщина, а если в качестве .txt – это нормально. Зачем?

Я экспортирую файл через HTTP-запрос, используя ASP.NET Web API. Для этого я возвращаю объект FileContentResult, как в:

return File(Encoding.UTF8.GetBytes(fileContents.ToString()), "text/plain; charset=UTF-8"); 

После нескольких минут, связанных с проблемами с кодировкой, я использую расширенный клиент REST Google для выполнения действия контроллера веб-приложения api, и файл загружается в порядке.

Ну, не совсем. Я изначально хотел, чтобы он был отправлен / загружен как CSV- файл. Если я задал тип содержимого запроса http « text / csv », а вызов File () устанавливает тип содержимого ответа на «text / csv» точно так же, Advanced REST Client будет отображать содержимое правильно, но excel откроет его как данные тарабарщины.

Если я просто изменил тип контента на « text / plain », сохраните его как .txt- файл (нужно переименовать его после сохранения, не знаете, почему он сохраняется как _.text-plain, а в виде csv он сохраняется с расширением .csv) и, наконец, выполняет импорт в Excel, как описано здесь Excel Import Text Wizard, а затем excel открывает файл правильно.

Почему .csv открывается как тарабарщина, а в качестве .txt это не так? Для открытия .csv не существует мастера импорта, например, с .txt-файлом (не то, что я знаю).

Предоставляя немного источника ниже:

 StringBuilder fileContents = new StringBuilder(); //csv header fileContents.AppendLine(String.Join(CultureInfo.CurrentCulture.TextInfo.ListSeparator, fileData.Select(fileRecord => fileRecord.Name))); //csv records foreach (ExportFileField fileField in fileData) fileContents.AppendLine(fileField.Value); return File(Encoding.UTF8.GetBytes(fileContents.ToString()), "text/plain; charset=UTF-8"); 

В соответствии с запросом, двоичное содержимое обоих файлов. Текстовая (.txt) версия (та, которая откроется в excel, используя импорт):

и .csv one (тот, который excel откроет с данными мусора):

(Файлы одинаковые, обрезка снимков экрана не была одинаковой …)

Я смог воспроизвести проблему, сохранив файл, содержащий греческие символы с спецификацией. Двойной щелчок пытается импортировать файл, используя локаль системы (греческий). При ручном импорте Excel обнаруживает кодовую страницу и предлагает использовать кодовую страницу 65001 (UTF8).

Такое поведение странно, но не ошибка. Текстовые файлы не содержат никаких указаний, которые бы помогли обнаружить их кодовую страницу, и это невозможно угадать. Файл ASCII, содержащий только символы AZ, сохраненные как 1252, идентичен сохраненному с помощью 1253. Именно поэтому Windows использует системную кодовую страницу, которая является локальной, используемой для всех программ и файлов, отличных от Юникода.

Когда вы дважды щелкаете по текстовому файлу, Excel не может запросить правильную кодировку – это может стать утомительным очень быстро. Вместо этого он открывает файл, используя региональные настройки и системную кодовую страницу. Файлы ASCII, созданные на вашем компьютере, сохраняются с использованием кодовой страницы вашей системы, поэтому это поведение логично. Файлы, предоставленные вам не-программистами , вероятно, будут сохранены, используя кодовую страницу вашей страны. Программисты обычно переключают все на английский, и вот как начинаются проблемы. Возможно, ваш клиент REST сохранил текст как ASCII, используя латинскую кодировку, используемую большинством программистов.

Когда вы импортируете текстовый файл на пустой лист, Excel может спросить вас, что делать. Он пытается обнаружить кодовую страницу, проверяя спецификацию или кодовую страницу, которая может соответствовать содержимому файла, и представляет галочку в диалоговом окне импорта вместе с предварительным просмотром. Десятичные и разделители столбцов по-прежнему сохраняются в ваших региональных настройках (их невозможно угадать). UTF8, как правило, легко угадать – файл начинается с спецификации или содержит записи NUL.

Кодовые страницы ASCII сложнее. Сохранение моего греческого файла как ASCII приводит к японской догадки. Думаю, для вас это английский юмор.

К моему удивлению, попытка выполнить запрос через браузер вместо использования расширенного клиента REST Google , щелчок по скачиваемому файлу просто работает! Excel открывает его правильно. Поэтому проблема должна быть с ARC.

В любом случае, поскольку процесс не будет выполнен с использованием http-клиента, отличного от браузера … моя проблема исчезла. Опять же, на экране вывода ARC файл отображается правильно. Я не знаю, почему, щелкнув по нему в Excel, он «испортится».

Странный.

Бинарное содержимое файла показывает корректный CSV-файл с кодировкой utf-8 с ивритскими символами. Если, как вы заявляете в комментариях, Excel не позволяет вам изменять предполагаемую кодировку файла при открытии CSV-файла, это скорее неправильное поведение в самом Excel (назовите его ошибкой, если хотите).

Ваши варианты: используйте LibreOffice ( http://www.libreoffice.org/ ), который компонент таблицы позволяет вам настроить параметры для открытия файла CSV.

Еще один – написать небольшую программу для явного преобразования вашего файла в кодировку, которую ожидает excel – если у вас установлен интерпретатор Python3, вы можете, например, ввести:

python -c "open('correct.csv', 'wt', encoding='cp1255').write(open('utf8.csv', encoding='utf8').read())"

Однако, если ваша стандартная кодировка Windows не является cp1255 для работы с ивритом, как я полагаю выше, это не поможет добиться успеха, но дать вам разную тарабарщину 🙂 В этом случае вам следует прибегнуть к использованию программ, которые могут правильно справиться с различные кодировки.

(NB. Есть вызов Python для возврата системной кодировки по умолчанию в Windows, но я забыл, что это такое, и это не легко googleable)

  • Отправить арабский текст в веб-службу
  • CSV UTF-8 вставка файла в таблицу имела ошибку несоответствия типа
  • Каков наилучший способ экспорта данных UTF8 в Excel?
  • файл excel не генерируется после выбора кодировки UTF-8
  • Excel в CSV со специальными символами?
  • Проблема Excel с CSV-файлом с кодировкой
  • 'latin-1' кодек не может кодировать символ u '\ u2014' в позиции 23: порядковый номер не в диапазоне (256)
  • Pandas: ascii codec can not encode character в позиции порядкового номера не в диапазоне - какая ячейка?
  • VBA - прочитайте CSV с utf-8 и выпишите еще один CSV с utf-8
  • Экспорт данных, содержащих umlauts в .csv, который читается Excel
  • Не удается получить правильные символы из Excel (в формате utf8) в PHP
  • Давайте будем гением компьютера.