Яке кодування правильно відкриває файли CSV у програмі Excel на Mac та Windows?


137

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

Чи є кодування, яке працює в обох світах?


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 BOM (такий же результат, як і ваш у Windows) та UTF-16BE BOM (які правильно розбирали поля, але BOM було включено як перші два символи в A1).
jveazey

Крім того , запросив вас переглянути stackoverflow.com/questions/155097 / ...
jveazey

@hveazey, цитується питання має відповідь кричущо рекомендуючи кодову сторінку Windows-1252. Це не спрацювало для моєї справи (німецькі умлаути та різкі).
Тімм

Відповіді:


61

Кодування 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

6
Трохи фаф, але це, мабуть, є відповіддю для імпорту файлів .csv з європейськими символами в Excel на Mac OSX
Фергі

1
Правда. Натомість він відповідає на питання ОП. У вашому випадку вам слід спочатку знати (або здогадуватися) кодування, яке використовується у вашому ".csv файлі з європейськими символами". Потім ви можете конвертувати його WINDOS-1252, що, швидше за все, буде правильно інтерпретовано як Mac, так і Windows Excel.
mikezter

1
Це не є реальним рішенням, рано чи пізно ви натрапите на персонаж, який не можна перетворити на WINDOWS-1252.
Вальтер Трос

2
WINDOWS-1252 вийде з ладу, якщо є китайський символ. Тож здається, що UTF-16LE з BOM - єдиний варіант.
XWang

Це добре працює для експорту даних SQL з діакритикою.
motorbaby

26

Для UTF-16LE з BOM, якщо ви використовуєте символи вкладок як ваші роздільники, а не коми Excel розпізнає поля. Причина цього працює в тому, що Excel фактично закінчується використанням свого аналізатора Unicode * .txt.

Caveat : Якщо файл буде відредаговано в 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, так і в Windows версії Excel. @Timm, вам слід подумати про зміну прийнятої відповіді.
П’єр Арно

2
Тим, хто знайшов це, працювали, чи ти насправді у своїх наборах даних маєш розширені (як китайські) символи? Кодування WIN-1252 працює на тих, оскільки вони знаходяться поза діапазоном.
Білл Ліпер

11

Ви лише спробували CSV-розділений комою та крапкою з комою. Якби ви спробували CSV-розділений CSV (його також називають TSV), ви знайшли б відповідь:

UTF-16LE з BOM (позначка порядку байтів), розділена на вкладку


Але : У коментарі ви згадуєте, що TSV - це не варіант для вас (я не зміг знайти цю вимогу у вашому запитанні). Це шкода. Це часто означає, що ви дозволяєте вручну редагувати файли TSV, що, мабуть, не є хорошою ідеєю. Візуальна перевірка файлів TSV не є проблемою. Крім того, редактори можуть бути налаштовані для відображення спеціального символу для маркування вкладок.

І так, я спробував це на Windows і Mac.


4

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

Так, МС!


4

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

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


3

У моєму випадку це спрацювало (Mac, Excel 2011, як кириличні, так і латинські символи з чеською діакритикою):

  • Charset UTF-16LE (просто UTF-16 було недостатньо)
  • BOM "\ 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? Чи можете ви перекласти це на PHP?
Тимм

@Timm, схожий на зразок Java, але в PHP ви можете використовувати iconv для перетворення - de3.php.net/manual/en/function.iconv.php
Ashish Datta

Гаразд @ user525081, те саме, що й інші відповіді. Це задовольняє користувачів Mac, залишаючи людей Windows в спокої; і це не відповідає на початкове запитання - кодування, яке працює на обох платформах. Дякую.
Тімм

2

UTF-8 без BOM наразі працює для мене в 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, має 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
* Windows Excel 2002 v.10.2701.2625


Якщо у вас є файл UTF-8 без BOM, iconv перетворить його в UTF-16LE без BOM (і, на жаль, немає способу сказати iconv, щоб додати його)
Walter Tross

2

У моїй Mac OS Text Wrangler ідентифікував файл CSV, створений за допомогою Excel, як "західне" кодування.

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

Це єдине, що працювало для мене на ОС 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");

0

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


Дякую @ royce23, але я просто пропоную файл CSV для завантаження. Я не можу представити його через HTTP, оскільки розмір розмітки сповільнить реакцію на сканування - експортована таблиця може містити мільйони рядків ...
Timm

з css ваш html був би лише крихітним дробом, більшим за csv, наприклад: <r><c>id</c><c>name</c><c>phone</c> </r>
royce3

Не впевнений, чи розумію, але я зберігаю CSV на сервері і пропоную посилання для завантаження. Генерування відповіді на HTML збиває занадто багато пам’яті PHP ...
Timm

Це спрацює (символи 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 як файл Origin (це повинен бути перший вибір).

Для цього використовується Excel 2011 (версія 14.4.2)

* У нижній частині вікна є невелике спадне місце


0

Вирішіть це за допомогою 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?

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.