Какая кодировка открывает файлы 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 с спецификацией, но CSV не распознается как таковой. Разделитель полей является запятой, но точка с запятой не меняет вещи.

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

Ответ 1

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

Ответ 2

Кодировки Excel

Я нашел кодировку WINDOWS-1252 наименее расстраивающей при работе с Excel. Так как его собственный собственный набор персонажей, основанный на Microsoft, можно предположить, что он будет работать как на Mac, так и на Windows-версии MS-Excel. Обе версии, по крайней мере, включают в себя соответствующий селектор "File origin" или "File encoding", который правильно считывает данные.

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

Эта кодировка представляет собой надмножество ISO-8859-1 (aka 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

Ответ 3

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

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

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

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

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

  • редактирование и закрытие только файла (работает как ожидалось).

Ответ 4

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

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


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

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

Ответ 5

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

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

Ответ 6

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

Yay, путь к MS!

Ответ 7

По моему мнению, 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);

Ответ 8

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

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

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

Ответ 9

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

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

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

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

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

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

PPS Мой оригинальный файл csv был создан на компьютере под управлением Windows 7, в формате UTF-8 (с байтами BOM EF BB BF в начале) и использовал разрывы строк CRLF. Comma использовалась как разделитель полей и одинарная кавычка как спецификатор текста. Он содержал буквы 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

Ответ 10

В моей Mac OS Text Wrangler идентифицировал CSV файл, созданный с использованием Excel как "западного" кодирования.

После некоторого googling я сделал этот небольшой script (я не уверен в доступности 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

Ответ 11

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

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

Ответ 12

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

Ответ 13

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

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

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

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

* В нижней части окна находится небольшое раскрывающееся меню

Ответ 14

Решите это с помощью 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 файл как на окнах, так и на MAC OS X.

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

Ответ 15

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

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