Какая кодировка правильно открывает файлы CSV в Excel на Mac и Windows? - PullRequest
127 голосов
/ 05 июля 2011

У нас есть веб-приложение, которое экспортирует файлы CSV, содержащие иностранные символы, с UTF-8, без спецификации. И пользователи Windows, и Mac получают символы мусора в Excel. Я пытался конвертировать в UTF-8 с спецификацией; С Excel / Win все в порядке, Excel / Mac показывает бред. Я использую Excel 2003 / Win, Excel 2011 / Mac. Вот все кодировки, которые я пробовал:

Encoding  BOM      Win                            Mac
--------  ---      ----------------------------   ------------
utf-8     --       scrambled                      scrambled
utf-8     BOM      WORKS                          scrambled
utf-16    --       file not recognized            file not recognized
utf-16    BOM      file not recognized            Chinese gibberish
utf-16LE  --       file not recognized            file not recognized
utf-16LE  BOM      characters OK,                 same as Win
                   row data all in first field

Лучшим является UTF-16LE с спецификацией, но CSV не распознается как таковой. Разделитель полей - запятая, но точка с запятой ничего не меняет.

Существует ли какая-либо кодировка, которая работает в обоих мирах?

Ответы [ 15 ]

2 голосов
/ 14 октября 2011

Мне кажется, что в Excel 2011 для Mac OS не используется Encoding.GetEncoding («10000»), как я думал, и потратил 2 дня впустую, но с той же iso, что и в ОС Microsoft.Лучшим доказательством этого является создание файла в Excel 2011 для MAC со специальными символами, сохранение его в формате CSV, а затем открытие его в текстовом редакторе MAC, и символы шифруются.

Для меня этот подход сработал - значениечто экспорт csv в Excel 2011 на MAC OS имеет специальные символы Западной Европы:

Encoding isoMacOS = Encoding.GetEncoding("iso-8859-1");
Encoding defaultEncoding = Encoding.Default; 

// Convert the string into a byte array.
byte[] defaultEncodingBytes = defaultEncoding.GetBytes(exportText);

// Perform the conversion from one encoding to the other.
byte[] ansiBytes = Encoding.Convert(defaultEncoding, isoMacOS, defaultEncodingBytes);

decodedString = isoMacOS.GetString(ansiBytes);
0 голосов
/ 06 сентября 2017

В моем случае добавление преамбулы к файлу решило мою проблему:

var data = Encoding.UTF8.GetBytes(csv);
var result = Encoding.UTF8.GetPreamble().Concat(data).ToArray();
return File(new MemoryStream(result), "application/octet-stream", "data.csv");
0 голосов
/ 01 апреля 2017

Решите это, используя Java (UTF-16LE с спецификацией):

String csvReportStr = getCsvReport();
byte[] data = Charset.forName("UTF-16LE").encode(csvReportStr)
    .put(0, (byte) 0xFF)
    .put(1, (byte) 0xFE)
    .array();

Обратите внимание, что файл CSV должен использовать TAB в качестве разделителя. Вы можете прочитать файл CSV как в Windows, так и в MAC OS X.

См. Как кодировать / декодировать байтовые массивы UTF-16LE с помощью спецификации?

0 голосов
/ 29 августа 2014

Это работает для меня

  1. Открыть файл в BBEdit или TextWrangler *.
  2. Установите файл как Unicode (UTF-16 Little-Endian) (Концы строк могут быть Unix или Windows). Сохранить!
  3. В Excel: Данные> Получить внешние данные> Импорт текстового файла ...

Теперь ключевой момент, выберите MacIntosh в качестве источника файла (это должен быть первый выбор).

Используется Excel 2011 (версия 14.4.2)

* В нижней части окна есть маленький выпадающий список

0 голосов
/ 09 августа 2011

вместо csv, при попытке вывести html с расширением XLS и mime-типом "application / excel".Я знаю, что это будет работать в Windows, но не могу говорить за MacOS

...