Какая кодировка правильно открывает файлы CSV в Excel как на Mac, так и на Windows?

У нас есть веб-приложение, которое экспортирует файлы 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 не распознается как таковой. Разделителем полей является запятая, но точка с запятой ничего не меняет.

Есть ли какая-нибудь кодировка, которая работает в обоих мирах?


person Timm    schedule 05.07.2011    source источник
comment
Что делать, если вы используете UTF-16LE для всех данных поля, но используете 8-битный / ASCII-символ для запятой? На основе этой статьи (creativyst.com/Doc/Articles/CSV/CSV01.htm #CSVAndEncodings), Excel может интерпретировать запятую Unicode как часть данных поля, а не как разделитель.   -  person jveazey    schedule 07.08.2011
comment
Интересный совет @jveazey. Я попробую это: mb_convert_encoding($str, "UTF-16LE"); в моем коде экспорта и опубликую здесь результаты.   -  person Timm    schedule 09.08.2011
comment
Не то чтобы это вам помогло, но я тестировал Excel 2007 SP2 в Windows (используя Notepad2 для создания тестовых файлов). Все работало, кроме спецификации UTF-16LE (тот же результат, что и у вас в Windows) и спецификации UTF-16BE (которая правильно анализировала поля, но спецификация была включена как первые 2 символа в A1).   -  person jveazey    schedule 10.08.2011
comment
Кроме того, обнаружено, что stackoverflow.com / questions / 155097 /   -  person jveazey    schedule 10.08.2011
comment
@hveazey, на процитированный вопрос есть ответ в виде жуткой рекомендации кодовой страницы Windows-1252. В моем случае это не сработало (немецкие умляуты и диез).   -  person Timm    schedule 31.01.2012
comment
@notJim, есть ответ Джасдипа Госала на stackoverflow.com/questions/4348802, который должен работать для Mac и ПК; Еще не пробовал. Он предлагает PHPExcel (который требует слишком много памяти для меня) и решение TSV, но мне нужен CSV.   -  person Timm    schedule 31.01.2012
comment
Я довольно скептически отношусь к этому решению, поскольку я пробовал UTF-8 с спецификацией среди других решений, и IIRC (я могу ошибаться), это не сработало. В любом случае: а) проблемы с производительностью были бы для меня убийцей, и б) это больше не моя проблема :) [пока, по крайней мере ...]   -  person davidtbernal    schedule 31.01.2012


Ответы (15)


Кодировки Excel

Я обнаружил, что кодировка WINDOWS-1252 наименее расстраивает при работе с Excel. Поскольку это в основном собственный набор символов Microsoft, можно предположить, что он будет работать как на Mac, так и на версии MS-Excel для Windows. Обе версии, по крайней мере, включают соответствующий селектор «Источник файла» или «Кодировка файла», который правильно считывает данные.

В зависимости от вашей системы и инструментов, которые вы используете, эта кодировка может также называться CP1252, ANSI, Windows (ANSI), MS-ANSI или просто Windows, среди других вариантов.

Эта кодировка является надмножеством ISO-8859-1 (также известного как LATIN1 и другие), поэтому вы можете вернуться к ISO-8859-1, если по какой-то причине не можете использовать WINDOWS-1252. Обратите внимание, что в ISO-8859-1 отсутствуют некоторые символы из WINDOWS-1252, как показано здесь:

| Char | ANSI | Unicode | ANSI Hex | Unicode Hex | HTML entity | Unicode Name                               | Unicode Range            |
| €    | 128  | 8364    | 0x80     | U+20AC      | €      | euro sign                                  | Currency Symbols         |
| ‚    | 130  | 8218    | 0x82     | U+201A      | ‚     | single low-9 quotation mark                | General Punctuation      |
| ƒ    | 131  | 402     | 0x83     | U+0192      | ƒ      | Latin small letter f with hook             | Latin Extended-B         |
| „    | 132  | 8222    | 0x84     | U+201E      | „     | double low-9 quotation mark                | General Punctuation      |
| …    | 133  | 8230    | 0x85     | U+2026      | …    | horizontal ellipsis                        | General Punctuation      |
| †    | 134  | 8224    | 0x86     | U+2020      | †    | dagger                                     | General Punctuation      |
| ‡    | 135  | 8225    | 0x87     | U+2021      | ‡    | double dagger                              | General Punctuation      |
| ˆ    | 136  | 710     | 0x88     | U+02C6      | ˆ      | modifier letter circumflex accent          | Spacing Modifier Letters |
| ‰    | 137  | 8240    | 0x89     | U+2030      | ‰    | per mille sign                             | General Punctuation      |
| Š    | 138  | 352     | 0x8A     | U+0160      | Š    | Latin capital letter S with caron          | Latin Extended-A         |
| ‹    | 139  | 8249    | 0x8B     | U+2039      | ‹    | single left-pointing angle quotation mark  | General Punctuation      |
| Π   | 140  | 338     | 0x8C     | U+0152      | Π    | Latin capital ligature OE                  | Latin Extended-A         |
| Ž    | 142  | 381     | 0x8E     | U+017D      |             | Latin capital letter Z with caron          | Latin Extended-A         |
| ‘    | 145  | 8216    | 0x91     | U+2018      | ‘     | left single quotation mark                 | General Punctuation      |
| ’    | 146  | 8217    | 0x92     | U+2019      | ’     | right single quotation mark                | General Punctuation      |
| “    | 147  | 8220    | 0x93     | U+201C      | “     | left double quotation mark                 | General Punctuation      |
| ”    | 148  | 8221    | 0x94     | U+201D      | ”     | right double quotation mark                | General Punctuation      |
| •    | 149  | 8226    | 0x95     | U+2022      | •      | bullet                                     | General Punctuation      |
| –    | 150  | 8211    | 0x96     | U+2013      | –     | en dash                                    | General Punctuation      |
| —    | 151  | 8212    | 0x97     | U+2014      | —     | em dash                                    | General Punctuation      |
| ˜    | 152  | 732     | 0x98     | U+02DC      | ˜     | small tilde                                | Spacing Modifier Letters |
| ™    | 153  | 8482    | 0x99     | U+2122      | ™     | trade mark sign                            | Letterlike Symbols       |
| š    | 154  | 353     | 0x9A     | U+0161      | š    | Latin small letter s with caron            | Latin Extended-A         |
| ›    | 155  | 8250    | 0x9B     | U+203A      | ›    | single right-pointing angle quotation mark | General Punctuation      |
| œ    | 156  | 339     | 0x9C     | U+0153      | œ     | Latin small ligature oe                    | Latin Extended-A         |
| ž    | 158  | 382     | 0x9E     | U+017E      |             | Latin small letter z with caron            | Latin Extended-A         |
| Ÿ    | 159  | 376     | 0x9F     | U+0178      | Ÿ      | Latin capital letter Y with diaeresis      | Latin Extended-A         |

Обратите внимание, что знак евро отсутствует. Эту таблицу можно найти на сайте Алана Вуда.

Преобразование

Преобразование выполняется по-разному для каждого инструмента и языка. Однако предположим, что у вас есть файл query_result.csv, который, как вы знаете, UTF-8 закодирован. Преобразуйте его в WINDOWS-1252, используя iconv:

iconv -f UTF-8 -t WINDOWS-1252 query_result.csv > query_result-win.csv
person mikezter    schedule 25.11.2013
comment
Немного сбивчивый, но похоже, что это ответ на импорт файлов .csv с европейскими символами в Excel на Mac OSX. - person Fergie; 08.05.2014
comment
Правда. Вместо этого он отвечает на вопрос OP. В вашем случае вам сначала нужно знать (или угадать) кодировку, используемую в вашем .csv файле, с европейскими символами. Затем вы можете преобразовать его в WINDOS-1252, который, скорее всего, будет правильно интерпретирован как Mac, так и Windows Excel. - person mikezter; 12.06.2014
comment
Это не настоящее решение, рано или поздно вы столкнетесь с персонажем, который нельзя преобразовать в WINDOWS-1252. - person Walter Tross; 13.03.2015
comment
WINDOWS-1252 выйдет из строя, если есть китайский символ. Таким образом, кажется, что UTF-16LE с спецификацией - единственный вариант. - person XWang; 05.05.2015
comment
Это хорошо работает для экспорта данных SQL с диакритическими знаками. - person motorbaby; 15.11.2016

Для UTF-16LE с спецификацией, если вы используете символы табуляции в качестве разделителей вместо запятых, Excel распознает поля. Причина, по которой это работает, заключается в том, что Excel фактически использует свой парсер Unicode * .txt.

Предостережение: если файл редактируется в Excel и сохраняется, он будет сохранен как разделенный табуляцией код ASCII. Теперь проблема в том, что, когда вы повторно открываете файл, Excel предполагает, что это настоящий CSV (с запятыми), видит, что это не Unicode, поэтому анализирует его как разделенный запятыми - и, следовательно, сделает из него хэш!

Обновление.

  • вы редактируете и закрываете Excel (пытается сохранить как 'Unicode * .txt')

по сравнению с:

  • редактирование и закрытие только файла (работает должным образом).
person Duncan Smart    schedule 28.01.2012
comment
Приятно, но предостережение ломает решение для меня; конечные пользователи не будут довольны сломанными листами Excel. - person Timm; 31.01.2012
comment
Возможно, если вы измените исходное расширение файла на * .txt, это сработает, но тогда вы потеряете связь между типом файла и Excel: то есть они не могут дважды щелкнуть файл и автоматически открыть его в Excel. - person Duncan Smart; 31.01.2012
comment
Для меня это не сработает. Конечный пользователь, не разбирающийся в компьютерах, должен открыть его в Excel без каких-либо препятствий. - person Timm; 01.02.2012
comment
У меня есть мои таблицы Excel в формате .csv, которые хорошо выглядят со специальными символами и разделенными полями. Я начинаю свою строку вывода с \ ufeff в качестве метки порядка байтов (BOM), затем использую вкладки \ t вместо запятых для разделения полей и кодирую файл с помощью utf-16LE. Прекрасно работает благодаря этой странице! - person Geek Stocks; 12.09.2013
comment
Первая строка sep=, и кодировка UTF16LE у меня сработали и не требовали другого символа-разделителя (оставалась запятая). Открытие файла двойным щелчком приводит к правильной загрузке файла со специальными символами и переносами строк в ячейках. Оборотная сторона: насколько я видел, заголовок sep=, не распознается ни одной программой, кроме Excel. Но OpenOffice / LibreOffice в любом случае не требует этого взлома (разрывы строк в содержимом ячеек работают нормально, тогда как загрузка из текстового файла / использование текста в помощник по столбцам в Excel неправильно обрабатывает разрывы строк в ячейках). - person CodeManX; 19.01.2017

Краткое изложение: нет решения. Excel 2011 / Mac не может правильно интерпретировать CSV-файл, содержащий умляуты и диакритические знаки, независимо от того, какую кодировку вы выполняете или какие прыжки выполняете. Я был бы рад услышать, что кто-нибудь скажет мне другое!

person Timm    schedule 30.01.2012
comment
Я обнаружил, что работают кодировки WIN-1252 или ISO-8859-1. Пожалуйста, посмотрите мой ответ. - person mikezter; 25.11.2013
comment
Решение состоит в том, чтобы использовать UTF-16LE и убедиться, что вы используете вкладки для разделения столбцов вместо запятых. - person Tim Groeneveld; 09.02.2014
comment
Вы действительно пробовали это на Win и Mac Тим? Как я уже говорил, в моем случае TSV не подходит. - person Timm; 13.02.2014
comment
Для меня экспорт работает нормально, если я использую кодировку WIN-1252 как на Mac, так и в версиях Excel для Windows. @Timm, вам следует подумать об изменении принятого ответа. - person Pierre Arnaud; 17.05.2014
comment
Для тех, кто нашел, что это работает, действительно ли у вас есть расширенные (например, китайские) символы в ваших наборах данных? Кодировка WIN-1252 нарушает их, потому что они находятся вне допустимого диапазона. - person Bill Leeper; 03.09.2014
comment
WIN-1252 не поддерживает экспорт Кюрасао в Excel 2010. - person QuestionC; 28.09.2015

Вы пробовали только CSV, разделенные запятыми и точкой с запятой. Если бы вы попробовали CSV с разделением табуляцией (также называемый TSV), вы бы нашли ответ:

UTF-16LE с BOM (метка порядка байтов), с разделением табуляцией


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

И да, я пробовал это на Windows и Mac.

person Walter Tross    schedule 13.03.2015

Вот решающий аргумент в пользу импорта CSV с кодировкой utf8 в Excel 2011 для Mac: Microsoft заявляет: «Excel для Mac в настоящее время не поддерживает UTF-8». Excel для Mac 2011 и UTF-8

Yay, путь к MS!

person Timm    schedule 18.02.2013

Лучший обходной путь для чтения файлов CSV с UTF-8 на Mac - преобразовать их в формат XLSX. Я нашел сценарий, сделанный Конрадом Фёрстнером, который я немного улучшил, добавив поддержку различных символов-разделителей.

Загрузите скрипт с Github https://github.com/brablc/clit/blob/master/csv2xlsx.py. Для его запуска вам потребуется установить модуль Python openpyxl для работы с файлами Excel: sudo easy_install openpyxl.

person brablc    schedule 29.06.2013

В моем случае это сработало (Mac, Excel 2011, кириллица и латинские символы с чешскими диакритическими знаками):

  • Кодировка UTF-16LE (просто UTF-16 было недостаточно)
  • Спецификация "\ xFF \ xFE"
  • \ t (табуляция) как разделитель
  • Не забудьте также закодировать разделитель и CRLF :-)
  • Используйте iconv вместо mb_convert_encoding
person Marek Demčák    schedule 27.09.2014

Мне кажется, что 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);
person user525081    schedule 14.10.2011
comment
На каком языке вы используете @ user525081? Вы можете перевести это на PHP? - person Timm; 01.02.2012
comment
@Timm выглядит как образец Java, но в PHP вы можете использовать iconv для преобразования - de3.php.net/manual/en/function.iconv.php - person Ashish Datta; 20.08.2012
comment
ОК @ user525081, такая же сделка, как и другие ответы. Это обслуживает пользователей Mac, оставляя людей Windows в беде; и он не отвечает на исходный вопрос - кодировка, которая работает на обеих платформах. Спасибо. - person Timm; 21.08.2012

UTF-8 без спецификации в настоящее время у меня работает в Excel Mac 2011 14.3.2.

UTF-8 + BOM вроде работает, но BOM отображается как тарабарщина.

UTF-16 работает, если вы импортируете файл и завершаете работу мастера, но не после двойного щелчка по нему.

person Craig Stuntz    schedule 01.04.2013

В Excel для Mac 2011 и Windows Excel 2002 у меня работало следующее:

  1. Используя iconv на Mac, преобразуйте файл в UTF-16 Little-Endian + назовите его * .txt (расширение .txt заставляет Excel запускать мастер импорта текста):

    iconv -f UTF-8 -t UTF-16LE filename.csv >filename_UTF-16LE.csv.txt

  2. Откройте файл в Excel и в мастере импорта текста выберите:

    • Step 1: File origin: ignore it, it doesn't matter what you choose
    • Шаг 2. Выберите правильные значения для разделителей и квалификатора текста
    • Шаг 3: при необходимости выберите форматы столбцов

PS UTF-16LE, созданный iconv, имеет байты спецификации FF FE в начале.

PPS Мой исходный файл csv был создан на компьютере под управлением Windows 7 в формате UTF-8 (с байтами спецификации EF BB BF в начале) и использовал разрывы строк CRLF. В качестве разделителя полей использовалась запятая, а в качестве квалификатора текста - одинарная кавычка. Он содержал буквы ASCII плюс разные латинские буквы с тильдами, умляутом и т. Д., А также немного кириллицы. Все правильно отображается как в Excel для Win, так и в Mac.

PPPS Точные версии программного обеспечения:
* Mac OS X 10.6.8
* Excel для Mac 2011 v.14.1.3
* Windows Server 2003 SP2
* Windows Excel 2002 v.10.2701.2625

person Koit Saarevet    schedule 29.12.2014
comment
Если у вас есть файл UTF-8 без спецификации, iconv преобразует его в UTF-16LE без спецификации (и, к сожалению, нет способа указать iconv добавить его) - person Walter Tross; 13.03.2015

В моей Mac OS Text Wrangler определил, что CSV-файл, созданный с помощью Excel, имеет "западную" кодировку.

После некоторого поиска в Google я создал этот небольшой скрипт (я не уверен в доступности Windows, возможно, с помощью Cygwin?) :

$ cat /usr/local/bin/utf8.sh

#!/bin/bash

INPUTFILE="$1"

iconv -f macroman -c -t UTF-8 $INPUTFILE |tr '\r' '\n' >/tmp/file.$$.csv

mv $INPUTFILE ms_trash
mv /tmp/file.$$.csv $INPUTFILE
person Nuno    schedule 21.06.2014
comment
Это единственное, что у меня сработало в OS X 10.14.2 (и Excel 2011). - person Donald; 15.02.2019

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

var data = Encoding.UTF8.GetBytes(csv);
var result = Encoding.UTF8.GetPreamble().Concat(data).ToArray();
return File(new MemoryStream(result), "application/octet-stream", "data.csv");
person razon    schedule 06.09.2017

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

person royce3    schedule 08.08.2011
comment
Спасибо @ royce23, но я просто предлагаю CSV-файл для загрузки. Я не могу представить его через HTTP, потому что сам размер разметки замедлит реакцию на сканирование - экспортированная таблица может содержать миллионы строк ... - person Timm; 09.08.2011
comment
с css ваш html будет лишь незначительно больше, чем csv, например: ‹r› ‹c› id ‹/c› ‹c› имя ‹/c› ‹c› phone ‹/c› ‹/r› - person royce3; 17.08.2011
comment
Не уверен, что понимаю, но я сохраняю CSV на сервере и предлагаю ссылку для скачивания. Генерация ответа HTML поглощает слишком много памяти PHP ... - person Timm; 31.01.2012
comment
Это будет работать (символы UTF-8), но если у вас есть встроенные разрывы строк в ячейках (тег br), Excel для Mac игнорирует (работает с Windows) CSS mso-data-placement:same-cell; - person cropredy; 25.05.2016

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

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

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

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

* Внизу окна есть небольшое раскрывающееся меню.

person Gazzer    schedule 29.08.2014

Решите это с помощью 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 с помощью спецификации?

person bluearrow    schedule 01.04.2017