Какая кодировка правильно открывает 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 117

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 (с запятыми), видит, что это не Юникод, поэтому анализирует его как запятую - и следовательно, сделает хэш из него!

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

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

против:

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

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

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

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


но: в комментарии вы упоминаете, что 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

ура, так держать МС!

Мне кажется, что Excel 2011 для Mac OS не использует кодировку.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);

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 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 В. 14.1.3
* Windows Server 2003 SP2
* Windows Excel 2002 V.10.2701. 2625

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

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

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

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

$ 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");