Quale codifica apre correttamente i file CSV con Excel su Mac e Windows?


137

Abbiamo un'app Web che esporta file CSV contenenti caratteri stranieri con UTF-8, nessuna distinta base. Sia gli utenti Windows che Mac ottengono caratteri inutili in Excel. Ho provato a convertire in UTF-8 con BOM; Excel / Win va bene con esso, Excel / Mac mostra senza senso. Sto usando Excel 2003 / Win, Excel 2011 / Mac. Ecco tutte le codifiche che ho provato:

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

Il migliore è UTF-16LE con BOM, ma il CSV non è riconosciuto come tale. Il separatore di campo è una virgola, ma il punto e virgola non cambia le cose.

C'è qualche codifica che funziona in entrambi i mondi?


1
Cosa succede se si utilizza UTF-16LE per tutti i dati del campo ma si utilizza il carattere 8 bit / ASCII per la virgola? Sulla base di questo articolo ( creativyst.com/Doc/Articles/CSV/CSV01.htm#CSVAndEncodings ), Excel potrebbe interpretare la virgola Unicode come parte dei dati del campo anziché del separatore.
jveazey,

1
Suggerimento interessante @jveazey. Proverò questo: mb_convert_encoding($str, "UTF-16LE");nel mio codice di esportazione e pubblica qui i risultati.
Timm

Non che questo ti aiuti, ma ho testato Excel 2007 SP2 su Windows (usando Notepad2 per creare i file di test). Tutto ha funzionato tranne UTF-16LE BOM (stesso risultato del tuo su Windows) e UTF-16BE BOM (che ha analizzato correttamente i campi ma la BOM è stata inclusa come i primi 2 caratteri in A1).
jveazey,

Inoltre, ha trovato questa stackoverflow.com/questions/155097/...
jveazey

@hveazey, la domanda citata ha una risposta da parte di Creechy che consiglia la tabella codici Windows-1252. Non ha funzionato per il mio caso (umlaut tedesche e sharp s).
Timm,

Risposte:


61

Codifiche Excel

Ho trovato la WINDOWS-1252codifica per essere il meno frustrante quando si tratta di Excel. Dal momento che il suo set di caratteri proprietario di Microsoft, fondamentalmente, si può supporre che funzionerà sia su Mac che su Windows, la versione di MS-Excel. Entrambe le versioni includono almeno un corrispondente selettore "Origine file" o "Codifica file" che legge correttamente i dati.

A seconda del sistema e gli strumenti utilizzati, questa codifica potrebbe anche essere chiamato CP1252, ANSI, Windows (ANSI), MS-ANSIo solo Windows, tra le altre varianti.

Questa codifica è un superset di ISO-8859-1(aka LATIN1e altri), quindi è possibile eseguire il fallback ISO-8859-1se non è possibile utilizzare WINDOWS-1252per qualche motivo. Tieni presente che ISO-8859-1mancano alcuni personaggi WINDOWS-1252come mostrato qui:

| 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         |

Si noti che manca il simbolo dell'euro . Questa tabella è disponibile su Alan Wood .

Conversione

La conversione avviene in modo diverso in ogni strumento e lingua. Tuttavia, supponiamo di avere un file query_result.csvche sai è UTF-8codificato. Converti in WINDOWS-1252usando iconv:

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

6
Un po 'complicato, ma questa sembra essere la risposta per importare file .csv con caratteri europei in Excel su Mac OSX
Fergie

1
Vero. Risponde invece alla domanda del PO. Nel tuo caso dovresti prima conoscere (o indovinare) la codifica utilizzata nel tuo "file .csv con caratteri europei". Quindi puoi convertirlo in WINDOS-1252, che molto probabilmente sarà interpretato correttamente sia da Mac che da Windows Excel.
mikezter,

1
Questa non è una vera soluzione, prima o poi ti imbatterai in un personaggio che non è convertibile in WINDOWS-1252.
Walter Tross,

2
WINDOWS-1252 non funzionerà se è presente un carattere cinese. Quindi sembra che UTF-16LE con BOM sia l'unica opzione.
XWang,

Questo funziona bene per le esportazioni di dati SQL con segni diacritici.
motorbaby,

26

Per UTF-16LE con DBA se si utilizzano i caratteri di tabulazione come delimitatori anziché virgole, Excel riconoscerà i campi. Il motivo per cui funziona è che Excel finisce per usare il suo parser Unicode * .txt.

Avvertenza : se il file viene modificato in Excel e salvato, verrà salvato come ASCII delimitato da tabulazioni. Il problema ora è che quando riapri il file Excel assume che sia un vero CSV (con virgole), vede che non è Unicode, quindi lo analizza come delimitato da virgole - e quindi ne farà un hash!

Aggiornamento : le avvertenze di cui sopra non sembrano accadere per me oggi in Excel 2010 (Windows) almeno, anche se sembra esserci una differenza nel comportamento di salvataggio se:

  • modifichi ed esci da Excel (prova a salvare come 'Unicode * .txt')

rispetto a:

  • modifica e chiusura solo del file (funziona come previsto).

1
Bello, ma l'avvertimento rompe la soluzione per me; gli utenti finali non saranno contenti dei fogli Excel rotti.
Timm,

Forse se modifichi l'estensione iniziale del file in * .txt funzionerebbe, ma perdi l'associazione tra il tipo di file ed Excel: cioè non possono fare doppio clic sul file e aprirlo automaticamente in Excel.
Duncan Smart,

Questo non funzionerà per me. Non essendo esperto di computer, l'utente finale deve aprirlo in Excel senza ostacoli.
Timm

Ho i miei fogli Excel ".csv" belli con caratteri speciali e campi separati. Comincio la mia stringa di output con "\ ufeff" come segno di ordine dei byte (BOM), quindi usando le schede "\ t" al posto delle virgole per la separazione dei campi e codificando il file con "utf-16LE". Funziona come un fascino, grazie a questa pagina!
Geek Stocks

La prima riga sep=,e la codifica UTF16LE hanno funzionato per me e non hanno richiesto un carattere di separazione diverso (è rimasta una virgola). L'apertura del file facendo doppio clic sul file caricato correttamente, con caratteri speciali e interruzioni di riga all'interno di celle intatte. Unico inconveniente: l' sep=,intestazione non è riconosciuta da nessun programma tranne Excel per quanto ho visto. Ma OpenOffice / LibreOffice non richiede comunque questo hack (le interruzioni di riga nei contenuti delle celle funzionano bene, mentre il caricamento da file di testo / l'utilizzo del testo nell'assistente di colonne in Excel non gestisce correttamente le interruzioni di riga nelle celle).
CodeManX,

24

Il punto più basso è: non esiste soluzione. Excel 2011 / Mac non è in grado di interpretare correttamente un file CSV contenente umlaut e segni diacritici, indipendentemente dalla codifica o dal salto del cerchio. Sarei felice di sentire qualcuno dirmi diverso!


4
Ho trovato funzionanti le codifiche WIN-1252 o ISO-8859-1. Si prega di vedere la mia risposta.
mikezter,

3
La soluzione è utilizzare UTF-16LE e assicurarsi che si utilizzino le schede per separare le colonne anziché le virgole.
Tim Groeneveld,

Hai davvero provato questo su Win e Mac Tim? Come ho già detto, TSV non è un'opzione nel mio caso.
Timm,

1
Per me, l'esportazione funziona bene se uso la codifica WIN-1252, sia su Mac che su Windows versioni di Excel. @Timm, dovresti considerare di cambiare la risposta accettata.
Pierre Arnaud,

2
Per quelli che lo hanno trovato funzionante, avevi effettivamente caratteri estesi (come il cinese) nei tuoi set di dati? La codifica WIN-1252 si rompe su quelli perché sono fuori portata.
Bill Leeper,

11

Hai provato solo CSV separati da virgola e separati da punto e virgola. Se avessi provato CSV separato da tabulazioni (chiamato anche TSV) avresti trovato la risposta:

UTF-16LE con distinta componenti (contrassegno ordine byte), separato da tabulazioni


Ma : in un commento menzioni che TSV non è un'opzione per te (non sono stato in grado di trovare questo requisito nella tua domanda). È un peccato. Spesso significa che si consente la modifica manuale dei file TSV, che probabilmente non è una buona idea. Il controllo visivo dei file TSV non è un problema. Inoltre, gli editor possono essere impostati per visualizzare un carattere speciale per contrassegnare le schede.

E sì, l'ho provato su Windows e Mac.


4

Ecco il clincher sull'importazione di CSV con codifica utf8 in Excel 2011 per Mac: Microsoft afferma: "Excel per Mac attualmente non supporta UTF-8". Excel per Mac 2011 e UTF-8

Yay, strada da percorrere per la SM!


4

La soluzione alternativa migliore per leggere i file CSV con UTF-8 su Mac è convertirli in formato XLSX. Ho trovato una sceneggiatura di Konrad Foerstner, che ho migliorato un po 'aggiungendo il supporto per diversi personaggi delimitatori.

Scarica lo script da Github https://github.com/brablc/clit/blob/master/csv2xlsx.py . Per eseguirlo è necessario installare un modulo Python openpyxl per la manipolazione di file di Excel: sudo easy_install openpyxl.


3

Nel mio caso ha funzionato (Mac, Excel 2011, caratteri cirillici e latini con segni diacritici cechi):

  • Charset UTF-16LE (semplicemente UTF-16 non era abbastanza)
  • BOM "\ xFF \ xFE"
  • \ t (tab) come separatore
  • Non dimenticare di codificare anche separatore e CRLF :-)
  • Usa iconv invece di mb_convert_encoding

2

Nel mio caso sembra che Excel 2011 per Mac OS non stia utilizzando Encoding.GetEncoding ("10000") come pensavo e ho perso 2 giorni con lo stesso iso di Microsoft OS. La migliore prova per questo è creare un file in Excel 2011 per MAC con caratteri speciali, salvarlo come CSV e quindi aprirlo nell'editor di testo MAC e i caratteri vengono mescolati.

Per me questo approccio ha funzionato, il che significa che l'esportazione CSV su Excel 2011 su MAC OS ha al suo interno speciali caratteri per l'Europa occidentale:

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

In che lingua stai usando @ user525081? Puoi tradurlo in PHP?
Timm

@Timm che sembra un campione Java ma in PHP puoi usare iconv per fare la conversione - de3.php.net/manual/en/function.iconv.php
Ashish Datta

OK @ user525081, stesso affare delle altre risposte. Questo si rivolge agli utenti Mac, lasciando le persone di Windows in difficoltà; e non risponde alla domanda originale: una codifica che funziona su entrambe le piattaforme. Grazie.
Timm,

2

UTF-8 senza BOM attualmente funziona per me in Excel Mac 2011 14.3.2.

UTF-8 + tipo di distinta base funziona, ma la distinta base viene resa incomprensibile.

UTF-16 funziona se si importa il file e si completa la procedura guidata, ma non se si fa semplicemente doppio clic su di esso.


2

Quanto segue ha funzionato per me su Excel per Mac 2011 e Windows Excel 2002:

  1. Usando iconv su Mac, converti il ​​file in UTF-16 Little-Endian + nominalo * .txt (l'estensione .txt forza Excel ad eseguire l'importazione guidata testo):

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

  2. Apri il file in Excel e nell'Importazione guidata testo scegli:

    • Passaggio 1: origine del file : ignoralo, non importa cosa scegli
    • Passaggio 2: selezionare i valori corretti per i delimitatori e il qualificatore di testo
    • Passaggio 3: se necessario, selezionare i formati di colonna

PS L'UTF-16LE creato da iconv ha BOM byte FF FE all'inizio.

PPS Il mio file CSV originale è stato creato su un computer Windows 7, in formato UTF-8 (con i byte della BOM EF BB BF all'inizio) e utilizzava le interruzioni di riga CRLF. La virgola è stata utilizzata come delimitatore di campo e virgoletta singola come qualificatore di testo. Conteneva lettere ASCII più lettere latine diverse con tilde, umlaut ecc., Oltre a un po 'di cirillico. Tutti visualizzati correttamente in Excel per Win e Mac.

Versioni del software PPPS Exact:
* Mac OS X 10.6.8
* Excel per Mac 2011 v.14.1.3
* Windows Server 2003 SP2
* Windows Excel 2002 v.10.2701.2625


Se hai un file UTF-8 senza BOM, iconv lo convertirà in UTF-16LE senza BOM (e sfortunatamente non c'è modo di dire a iconv di aggiungerne uno)
Walter Tross

2

Sul mio Mac OS, Text Wrangler ha identificato un file CSV creato con Excel con codifica "Western".

Dopo aver cercato su Google ho creato questo piccolo script (non sono sicuro della disponibilità di Windows, forse con 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

Questa è l'unica cosa che ha funzionato per me su OS X 10.14.2 (ed Excel 2011)
Donald

1

Nel mio caso l'aggiunta di Preambolo al file ha risolto il mio problema:

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

invece di csv, provando a produrre html con estensione XLS e mime-type "application / excel". So che funzionerà in Windows, ma non posso parlare per MacOS


Grazie @ royce23, ma sto solo offrendo il file CSV per il download. Non posso presentarlo tramite HTTP, perché la vastità del markup rallenterebbe la risposta a passo d'uomo - la tabella esportata può contenere milioni di righe ...
Timm

con css il tuo html sarebbe solo una piccola frazione più grande di csv, ad esempio: <r><c>id</c><c>name</c><c>phone</c> </r>
royce3

Non sono sicuro di aver capito, ma sto salvando il CSV sul server e offro un link per il download. La generazione di una risposta HTML consuma troppa memoria PHP ...
Timm,

Funzionerà (i caratteri UTF-8) ma se hai interruzioni di linea incorporate all'interno di celle ( brtag), Excel per Mac ignora il CSS (funziona con Windows) mso-data-placement:same-cell;
cropredy

0

Questo funziona per me

  1. Apri il file in BBEdit o TextWrangler *.
  2. Imposta il file come Unicode (UTF-16 Little-Endian) (le terminazioni di linea possono essere Unix o Windows). Salva!
  3. In Excel: Dati> Ottieni dati esterni> Importa file di testo ...

Ora il punto chiave, scegli MacIntosh come Origine file (dovrebbe essere la prima scelta).

Questo utilizza Excel 2011 (versione 14.4.2)

* C'è un piccolo menu a discesa nella parte inferiore della finestra


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.