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

137

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

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

Тимм
источник
1
Что если вы используете UTF-16LE для всех данных поля, но используете запятую для символа 8 бит / ASCII? Исходя из этой статьи ( creativyst.com/Doc/Articles/CSV/CSV01.htm#CSVAndEncodings ), Excel может интерпретировать запятую Unicode как часть данных поля вместо разделителя.
Jveazey
1
Интересный совет @jveazey. Я попробую это: mb_convert_encoding($str, "UTF-16LE");в моем коде экспорта и выложу результаты здесь.
Тим
Не то чтобы это вам помогло, но я тестировал Excel 2007 SP2 в Windows (используя Notepad2 для создания тестовых файлов). Все работало, кроме спецификации UTF-16LE (тот же результат, что и у вас в Windows) и спецификации UTF-16BE (которая правильно анализировала поля, но эта спецификация была включена как первые 2 символа в A1).
Jveazey
Также нашел этот stackoverflow.com/questions/155097/…
jveazey
@hveazey, цитируемый вопрос имеет ответ от жутко рекомендуемой кодовой страницы Windows-1252. Это не сработало для моего случая (немецкие умлауты и острые буквы)
Тимм

Ответы:

61

Кодировки Excel

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

В зависимости от вашей системы и инструментов , которые вы используете, эта кодировка также может быть названа 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         |

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

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

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

iconv -f UTF-8 -t WINDOWS-1252 query_result.csv > query_result-win.csv
mikezter
источник
6
Небольшая ошибка, но это, кажется, ответ на импорт файлов .csv с европейскими символами в Excel на Mac OSX
Fergie
1
Правда. Вместо этого он отвечает на вопрос ОП. В вашем случае вы должны сначала узнать (или угадать) кодировку, используемую в вашем ".csv файле с европейскими символами". Затем вы можете преобразовать его в файл WINDOS-1252, который, скорее всего, будет правильно интерпретирован как Mac, так и Windows Excel.
mikezter
1
Это не реальное решение, рано или поздно вы встретите персонажа, который не конвертируется в WINDOWS-1252.
Уолтер Тросс
2
WINDOWS-1252 завершится ошибкой, если есть китайский символ. Таким образом, кажется, что UTF-16LE с спецификацией является единственным вариантом.
XWang
Это хорошо работает для экспорта данных SQL с диакритическими знаками.
Motorbaby
26

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

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

Обновление : вышеупомянутое предостережение, кажется, не происходит для меня сегодня в Excel 2010 (Windows), по крайней мере, хотя, кажется, есть разница в поведении сохранения, если:

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

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

  • редактирование и закрытие только файла (работает как положено).
Дункан Смарт
источник
1
Хорошо, но предостережение нарушает решение для меня; конечные пользователи не будут довольны сломанными листами Excel.
Тим
Возможно, если вы измените исходное расширение файла на * .txt, оно будет работать, но тогда вы потеряете связь между типом файла и Excel: то есть они не могут дважды щелкнуть файл и автоматически открыть его в Excel.
Дункан Смарт
Это не сработает для меня. Не будучи разбирающимся в компьютерах, конечный пользователь должен открыть его в Excel без каких-либо препятствий.
Тим
У меня есть свои ".csv" листы Excel, хорошо выглядящие со специальными символами и разделенными полями. Я начинаю свою строку вывода с «\ ufeff» в качестве метки порядка байтов (BOM), затем использую вкладки «\ t» вместо запятых для разделения полей и кодирую файл с помощью «utf-16LE». Работает как шарм, благодаря этой странице!
Geek Stocks
Первая строка sep=,и кодировка UTF16LE работали для меня и не требовали другого символа-разделителя (он оставался запятой). Открытие файла двойным щелчком мыши загрузило файл правильно, со специальными символами и разрывами строк в ячейках без изменений. Недостаток: sep=,насколько я видел, заголовок не распознается ни одной программой, кроме Excel. Но OpenOffice / LibreOffice в любом случае не требует этого взлома (разрывы строк в содержимом ячеек работают очень хорошо, тогда как загрузка из текстового файла / использование текста в помощник по столбцам в Excel неправильно обрабатывает разрывы строк в ячейках).
CodeManX
24

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

Тимм
источник
4
Я обнаружил, что кодировки WIN-1252 или ISO-8859-1 работают. Пожалуйста, посмотрите мой ответ.
mikezter
3
Решение состоит в том, чтобы использовать UTF-16LE и убедиться, что вы используете вкладки для разделения столбцов вместо запятых.
Тим Греневельд
Вы действительно пробовали это на Win и Mac Tim? Как я уже говорил, TSV не вариант в моем случае.
Тим
1
Для меня экспорт работает нормально, если я использую кодировку WIN-1252, как на Mac, так и на версиях Excel для Windows. @ Тимм, тебе стоит подумать об изменении принятого ответа.
Пьер Арно
2
Для тех, кто нашел это работающим, вы действительно расширили (например, китайские) символы в своих наборах данных? Кодировка WIN-1252 ломается на тех, потому что они находятся вне диапазона.
Билл Липер
11

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

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


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

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

Уолтер Тросс
источник
4

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

Yay, способ пойти MS!

Тимм
источник
4

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

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

brablc
источник
3

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

  • Charset UTF-16LE (просто UTF-16 было недостаточно)
  • Спецификация "\ xFF \ xFE"
  • \ t (вкладка) в качестве разделителя
  • Не забудьте также кодировать разделитель и CRLF :-)
  • Используйте iconv вместо mb_convert_encoding
Марек Демчак
источник
2

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

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

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

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

Крейг Штунц
источник
2

В 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 и в мастере импорта текста выберите:

    • Шаг 1: Происхождение файла : игнорируйте его, не важно, что вы выберете
    • Шаг 2: выберите правильные значения для разделителей и текстовых квалификаторов
    • Шаг 3: при необходимости выберите форматы столбцов

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

PPS Мой оригинальный CSV-файл был создан на компьютере под управлением Windows 7 в формате UTF-8 (с байтами BOM 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

Коит Сааревет
источник
Если у вас есть файл UTF-8 без BOM, iconv преобразует его в UTF-16LE без BOM (и, к сожалению, нет способа указать iconv добавить его)
Уолтер Тросс
2

На моей 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
Нуно
источник
Это единственное, что работало для меня на OS X 10.14.2 (и Excel 2011)
Дональд
1

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

var data = Encoding.UTF8.GetBytes(csv);
var result = Encoding.UTF8.GetPreamble().Concat(data).ToArray();
return File(new MemoryStream(result), "application/octet-stream", "data.csv");
Razon
источник
0

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

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

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

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

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

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

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

Gazzer
источник
0

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

bluearrow
источник