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

У нас есть веб-приложение, которое экспортирует CSV-файлы, содержащие иностранные символы с UTF-8, без спецификации. Пользователи Windows и Mac получают символы мусора в Excel. Я попытался преобразовать в UTF-8 С BOM; 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 с BOM, но CSV не распознается как таковой. Разделитель полей запятая, а точка с запятой не изменяется вещи.

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

15 ответов


Кодировки Excel

нашел WINDOWS-1252 кодировка наименее неприятно, общаясь с Excel. Поскольку его в основном Microsofts собственный проприетарный набор символов, можно предположить, что он будет работать как на 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         |

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

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

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

iconv -f UTF-8 -t WINDOWS-1252 query_result.csv > query_result-win.csv

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

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

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

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

против:

  • редактирование и закрывающим тегом просто файлом (работает как положено).

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


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

UTF-16LE С BOM (метка порядка байтов), tab-разделены


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

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


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

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


вот ключ к импорту CSV в кодировке utf8 в Excel 2011 для Mac: Microsoft говорит: "Excel для Mac в настоящее время не поддерживает UTF-8."Excel для Mac 2011 и UTF-8

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


Мне кажется, что Excel 2011 для Mac OS не использует кодировку.GetEncoding ("10000"), как я думал, и потратил 2 дня, но тот же iso, что и на Microsoft OS. Лучшее доказательство этого-сделать файл в 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);

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

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

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


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

  1. используя iconv на Mac, преобразуйте файл в UTF-16 Little-Endian + name it *.txt (the .расширение 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, имеет BOM bytes FF FE в начале.

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

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


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

  • кодировка UTF-16LE (просто UTF-16 было недостаточно)
  • BOM "\xFF\xFE"
  • \t (tab) в качестве разделителя
  • не забудьте также кодировать разделитель и CRLFs: -)
  • используйте iconv вместо mb_convert_encoding

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

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

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

#!/bin/bash

INPUTFILE=""

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

mv $INPUTFILE ms_trash
mv /tmp/file.$$.csv $INPUTFILE

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


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

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

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

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

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


решите это с помощью java (UTF-16LE с BOM):

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


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

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