Quel encodage ouvre correctement les fichiers CSV avec Excel sur Mac et Windows?

137

Nous avons une application Web qui exporte des fichiers CSV contenant des caractères étrangers avec UTF-8, sans nomenclature. Les utilisateurs Windows et Mac obtiennent des caractères inutiles dans Excel. J'ai essayé de convertir en UTF-8 avec BOM; Excel / Win est bien avec cela, Excel / Mac montre du charabia. J'utilise Excel 2003 / Win, Excel 2011 / Mac. Voici tous les encodages que j'ai essayés:

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

Le meilleur est UTF-16LE avec BOM, mais le CSV n'est pas reconnu comme tel. Le séparateur de champ est une virgule, mais le point-virgule ne change rien.

Y a-t-il un encodage qui fonctionne dans les deux mondes?

Timm
la source
1
Que faire si vous utilisez UTF-16LE pour toutes les données de champ mais utilisez le caractère 8 bits / ASCII pour la virgule? Sur la base de cet article ( creativyst.com/Doc/Articles/CSV/CSV01.htm#CSVAndEncodings ), Excel pourrait interpréter la virgule Unicode dans le cadre des données de champ au lieu du séparateur.
jveazey
1
Conseil intéressant @jveazey. Je vais essayer ceci: mb_convert_encoding($str, "UTF-16LE");dans mon code d'exportation et poster les résultats ici.
Timm
Non pas que cela vous aide, mais j'ai testé Excel 2007 SP2 sur Windows (en utilisant Notepad2 pour créer les fichiers de test). Tout fonctionnait sauf la nomenclature UTF-16LE (même résultat que le vôtre sous Windows) et la nomenclature UTF-16BE (qui analysait correctement les champs mais la nomenclature était incluse comme les 2 premiers caractères de A1).
jveazey
Aussi, trouvé ce stackoverflow.com/questions/155097/…
jveazey
@hveazey, la question citée a une réponse par creechy recommandant la page de code Windows-1252. Cela n'a pas fonctionné pour mon cas (trémas allemands et sharp s).
Timm

Réponses:

61

Encodages Excel

J'ai trouvé le WINDOWS-1252 encodage était le moins frustrant lorsqu'il s'agissait d'Excel. Étant donné qu'il s'agit essentiellement d'un jeu de caractères propriétaire de Microsofts, on peut supposer qu'il fonctionnera à la fois sur Mac et sur la version Windows de MS-Excel. Les deux versions comprennent au moins un sélecteur correspondant "Origine du fichier" ou "Codage du fichier" qui lit correctement les données.

En fonction de votre système et les outils que vous utilisez, ce codage peut aussi être nommé CP1252, ANSI, Windows (ANSI), MS-ANSIou tout simplementWindows , entre autres variations.

Cet encodage est un sur-ensemble de ISO-8859-1(aka LATIN1et autres), vous pouvez donc vous rabattre sur ISO-8859-1si vous ne pouvez pas l'utiliser WINDOWS-1252pour une raison quelconque. Sachez qu'il ISO-8859-1manque certains caractères WINDOWS-1252comme indiqué ici:

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

Notez que le signe euro est manquant . Ce tableau se trouve chez Alan Wood .

Conversion

La conversion se fait différemment dans chaque outil et langue. Cependant, supposons que vous ayez un fichier query_result.csvdont vous savez qu'il est UTF-8encodé. Convertissez-le en WINDOWS-1252utilisant iconv:

iconv -f UTF-8 -t WINDOWS-1252 query_result.csv > query_result-win.csv
Mikezter
la source
6
Un peu faux, mais cela semble être la solution pour importer des fichiers .csv avec des caractères européens dans Excel sur Mac OSX
Fergie
1
Vrai. Il répond à la question du PO à la place. Dans votre cas, vous devrez d'abord connaître (ou deviner) l'encodage utilisé dans votre "fichier .csv avec des caractères européens". Ensuite, vous pouvez le convertir en WINDOS-1252, qui sera probablement correctement interprété par Mac et Windows Excel.
mikezter
1
Ce n'est pas une vraie solution, tôt ou tard vous rencontrerez un personnage qui n'est pas convertible en WINDOWS-1252.
Walter Tross
2
WINDOWS-1252 échouera s'il y a un caractère chinois. Il semble donc que l'UTF-16LE avec BOM soit la seule option.
XWang
Cela fonctionne bien pour les exportations de données SQL avec des signes diacritiques.
motorbaby
26

Pour UTF-16LE avec nomenclature, si vous utilisez des caractères de tabulation comme délimiteurs au lieu de virgules, Excel reconnaîtra les champs. La raison pour laquelle cela fonctionne est qu'Excel finit par utiliser son analyseur Unicode * .txt.

Caveat : si le fichier est modifié dans Excel et enregistré, il sera enregistré au format ASCII délimité par des tabulations. Le problème maintenant est que lorsque vous rouvrez le fichier, Excel suppose qu'il s'agit d'un vrai CSV (avec des virgules), voit que ce n'est pas Unicode, il analyse donc comme délimité par des virgules - et en fera donc un hachage!

Mettre à jour : La mise en garde ci-dessus ne semble pas se produire pour moi aujourd'hui dans Excel 2010 (Windows) au moins, bien qu'il semble y avoir une différence dans le comportement d'enregistrement si:

  • vous modifiez et quittez Excel (essaie d'enregistrer sous 'Unicode * .txt')

par rapport à:

  • éditer et fermer uniquement le fichier (fonctionne comme prévu).
Duncan Smart
la source
1
Bien, mais la mise en garde casse la solution pour moi; les utilisateurs finaux ne seront pas satisfaits des feuilles Excel cassées.
Timm
Peut-être que si vous changez l'extension initiale du fichier en * .txt, cela fonctionnera, mais alors vous perdez l'association entre le type de fichier et Excel: c'est-à-dire qu'ils ne peuvent pas double-cliquer sur le fichier et l'ouvrir automatiquement dans Excel.
Duncan Smart
Cela ne fonctionnera pas pour moi. N'étant pas doué en informatique, l'utilisateur final doit l'ouvrir dans Excel sans aucun obstacle.
Timm
J'ai mes feuilles Excel ".csv" en bon état avec des caractères spéciaux et des champs séparés. Je commence ma chaîne de sortie avec "\ ufeff" comme marque d'ordre d'octet (BOM), puis en utilisant les onglets "\ t" à la place des virgules pour la séparation des champs, et en codant le fichier avec "utf-16LE". Fonctionne comme un charme, grâce à cette page!
Geek Stocks
La première ligne sep=,et le codage UTF16LE ont fonctionné pour moi et ne nécessitaient pas de caractère de séparation différent (il restait une virgule). L'ouverture du fichier par double-clic a chargé le fichier correctement, avec des caractères spéciaux et des sauts de ligne dans les cellules intacts. Inconvénient: l'en- sep=,tête n'est reconnu par aucun programme sauf Excel pour autant que j'ai vu. Mais OpenOffice / LibreOffice ne nécessite de toute façon pas ce hack (les sauts de ligne dans le contenu des cellules fonctionnent très bien, alors que le chargement à partir d'un fichier texte / l'utilisation du texte dans l'assistant de colonnes dans Excel ne gère pas correctement les sauts de ligne dans les cellules).
CodeManX
24

La vérité est: il n'y a pas de solution. Excel 2011 / Mac ne peut pas interpréter correctement un fichier CSV contenant des trémas et des signes diacritiques, quel que soit l'encodage ou le saut de cercle que vous faites. Je serais heureux d'entendre quelqu'un me dire différent!

Timm
la source
4
J'ai trouvé que les encodages WIN-1252 ou ISO-8859-1 fonctionnaient. S'il vous plaît voir ma réponse.
mikezter
3
La solution consiste à utiliser UTF-16LE et à vous assurer que vous utilisez des onglets pour séparer les colonnes au lieu de virgules.
Tim Groeneveld
Avez-vous vraiment essayé cela sur Win et Mac Tim? Comme je l'ai mentionné, TSV n'est pas une option dans mon cas.
Timm
1
Pour moi, l'exportation fonctionne bien si j'utilise l'encodage WIN-1252, à la fois sur Mac et sur les versions Windows d'Excel. @Timm, vous devriez envisager de changer la réponse acceptée.
Pierre Arnaud
2
Pour ceux qui ont trouvé que cela fonctionnait, aviez-vous des caractères étendus (comme le chinois) dans vos ensembles de données? L'encodage WIN-1252 s'arrête sur ceux-ci car ils sont hors de portée.
Bill Leeper le
11

Vous n'avez essayé que les CSV séparés par des virgules et des points-virgules. Si vous aviez essayé CSV séparé par des tabulations (également appelé TSV), vous auriez trouvé la réponse:

UTF-16LE avec BOM (marque d'ordre d'octet), séparés par des tabulations


Mais : dans un commentaire, vous mentionnez que TSV n'est pas une option pour vous (je n'ai cependant pas pu trouver cette exigence dans votre question). C'est dommage. Cela signifie souvent que vous autorisez l'édition manuelle des fichiers TSV, ce qui n'est probablement pas une bonne idée. La vérification visuelle des fichiers TSV n'est pas un problème. En outre, les éditeurs peuvent être configurés pour afficher un caractère spécial pour marquer les onglets.

Et oui, j'ai essayé cela sur Windows et Mac.

Walter Tross
la source
4

Voici le clincher sur l'importation de CSV encodé en utf8 dans Excel 2011 pour Mac: Microsoft déclare: "Excel pour Mac ne prend actuellement pas en charge UTF-8." Excel pour Mac 2011 et UTF-8

Ouais, chemin à parcourir MS!

Timm
la source
4

La meilleure solution de contournement pour lire des fichiers CSV avec UTF-8 sur Mac consiste à les convertir au format XLSX. J'ai trouvé un script créé par Konrad Foerstner, que j'ai amélioré un peu en ajoutant la prise en charge de différents caractères de délimitation.

Téléchargez le script depuis Github https://github.com/brablc/clit/blob/master/csv2xlsx.py . Pour l' exécuter , vous devez installer un module python openpyxl pour la manipulation de fichiers Excel: sudo easy_install openpyxl.

brablc
la source
3

Dans mon cas, cela a fonctionné (Mac, Excel 2011, caractères cyrilliques et latins avec diacritiques tchèques):

  • Charset UTF-16LE (simplement UTF-16 ne suffisait pas)
  • Nomenclature "\ xFF \ xFE"
  • \ t (tabulation) comme séparateur
  • N'oubliez pas d'encoder également le séparateur et les CRLF :-)
  • Utilisez iconv au lieu de mb_convert_encoding
Marek Demčák
la source
2

Il me semble qu'Excel 2011 pour Mac OS n'utilise pas Encoding.GetEncoding ("10000") comme je le pensais et j'ai perdu 2 jours avec mais le même iso que sur Microsoft OS. La meilleure preuve pour cela est de créer un fichier dans Excel 2011 pour MAC avec des caractères spéciaux, de l'enregistrer au format CSV, puis de l'ouvrir dans l'éditeur de texte MAC et les caractères sont brouillés.

Pour moi, cette approche a fonctionné - ce qui signifie que l'exportation csv sur Excel 2011 sur MAC OS contient des caractères spéciaux pour l'Europe de l'Ouest:

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
la source
Quelle langue utilisez-vous @ user525081? Pouvez-vous le traduire en PHP?
Timm
@Timm qui ressemble à un exemple Java mais en PHP, vous pouvez utiliser iconv pour faire la conversion - de3.php.net/manual/en/function.iconv.php
Ashish Datta
OK @ user525081, même affaire que les autres réponses. Cela s'adresse aux utilisateurs de Mac, laissant les utilisateurs de Windows dans l'embarras; et cela ne répond pas à la question initiale - un encodage qui fonctionne sur les deux plates-formes. Merci.
Timm
2

UTF-8 sans nomenclature fonctionne actuellement pour moi dans Excel Mac 2011 14.3.2.

UTF-8 + BOM type de travaux, mais BOM rendu comme charabia.

UTF-16 fonctionne si vous importez le fichier et terminez l'assistant, mais pas si vous double-cliquez dessus.

Craig Stuntz
la source
2

Ce qui suit a fonctionné pour moi sur Excel pour Mac 2011 et Windows Excel 2002:

  1. À l'aide d'iconv sur Mac, convertissez le fichier en UTF-16 Little-Endian + nommez-le * .txt (l'extension .txt force Excel à exécuter l'assistant d'importation de texte):

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

  2. Ouvrez le fichier dans Excel et dans l'assistant d'importation de texte, choisissez:

    • Étape 1: Origine du fichier : ignorez-la, peu importe ce que vous choisissez
    • Étape 2: sélectionnez les valeurs appropriées pour les délimiteurs et le qualificatif de texte
    • Étape 3: si nécessaire, sélectionnez les formats de colonne

PS L'UTF-16LE créé par iconv a des octets de nomenclature FF FE au début.

PPS Mon fichier csv original a été créé sur un ordinateur Windows 7, au format UTF-8 (avec les octets de nomenclature EF BB BF au début) et utilisait des sauts de ligne CRLF. La virgule était utilisée comme délimiteur de champ et guillemet simple comme qualificatif de texte. Il contenait des lettres ASCII plus différentes lettres latines avec des tildes, un tréma, etc., ainsi que du cyrillique. Tout s'affiche correctement dans Excel pour Win et Mac.

PPPS Versions exactes du logiciel:
* Mac OS X 10.6.8
* Excel pour Mac 2011 v.14.1.3
* Windows Server 2003 SP2
* Windows Excel 2002 v.10.2701.2625

Koit Saarevet
la source
Si vous avez un fichier UTF-8 sans BOM, iconv le convertira en UTF-16LE sans BOM (et malheureusement il n'y a aucun moyen de dire à iconv d'en ajouter un)
Walter Tross
2

Sur mon Mac OS, Text Wrangler a identifié un fichier CSV créé avec Excel comme ayant un encodage «occidental».

Après quelques recherches sur Google, j'ai créé ce petit script (je ne suis pas sûr de la disponibilité de Windows, peut-être avec 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
Nuno
la source
C'est la seule chose qui a fonctionné pour moi sur OS X 10.14.2 (et Excel 2011)
Donald
1

Dans mon cas, l'ajout d'un préambule au fichier a résolu mon problème:

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

au lieu de csv, essayez de sortir du HTML avec une extension XLS et un type mime "application / excel". Je sais que cela fonctionnera sous Windows, mais je ne peux pas parler pour MacOS

royce3
la source
Merci @ royce23, mais je propose simplement le fichier CSV en téléchargement. Je ne peux pas le présenter via HTTP car la taille même du balisage ralentirait la réponse à une analyse - la table exportée peut contenir des millions de lignes ...
Timm
avec css votre html ne serait qu'une infime fraction de plus que csv, par exemple: <r><c>id</c><c>name</c><c>phone</c> </r>
royce3
Je ne sais pas si je comprends, mais j'enregistre le CSV sur le serveur et je propose un lien de téléchargement. Générer une réponse HTML engloutit trop de mémoire PHP ...
Timm
Cela fonctionnera (les caractères UTF-8) mais si vous avez des sauts de ligne intégrés dans les cellules ( brbalise), Excel pour Mac ignore le CSS (fonctionne avec Windows) mso-data-placement:same-cell;
cropredy
0

Cela fonctionne pour moi

  1. Ouvrez le fichier dans BBEdit ou TextWrangler *.
  2. Définissez le fichier comme Unicode (UTF-16 Little-Endian) (les fins de ligne peuvent être Unix ou Windows). Sauver!
  3. Dans Excel: Données> Obtenir des données externes> Importer un fichier texte ...

Maintenant, le point clé, choisissez MacIntosh comme origine du fichier (cela devrait être le premier choix).

Cela utilise Excel 2011 (version 14.4.2)

* Il y a un petit menu déroulant en bas de la fenêtre

Gazzer
la source
0

Résolvez cela en utilisant java (UTF-16LE avec BOM):

String csvReportStr = getCsvReport();
byte[] data = Charset.forName("UTF-16LE").encode(csvReportStr)
    .put(0, (byte) 0xFF)
    .put(1, (byte) 0xFE)
    .array();

Notez que le fichier CSV doit utiliser TAB comme séparateur. Vous pouvez lire le fichier CSV à la fois sous Windows et sous MAC OS X.

Reportez-vous à: Comment encoder / décoder des tableaux d'octets UTF-16LE avec une nomenclature?

Flèche bleue
la source