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



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



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

2512   15  

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         |
Обратите внимание, что знак евроотсутствует . Эту таблицу можно найти по адресу Alan Wood.

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

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

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

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

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

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

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

Вы пробовали только 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 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 без BOM в настоящее время работает для меня в 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 V. 14. 1. 3
* Windows Server 2003 SP2
* Окна Excel 2002 г. в. 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, как имеющий "Западную" кодировку.

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

Вместо 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 с помощью BOM?

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

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

Comments

    Ничего не найдено.