141 votes

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

Nous avons une application web qui exporte des fichiers CSV contenant des caractères étrangers avec UTF-8, sans BOM. Les utilisateurs de Windows et de Mac obtiennent des caractères aberrants dans Excel. J'ai essayé de convertir en UTF-8 avec BOM ; Excel/Win s'en sort bien, Excel/Mac affiche 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 champs est la virgule, mais le point-virgule ne change pas les choses.

Existe-t-il un codage qui fonctionne dans les deux mondes ?

1 votes

Que se passe-t-il si vous utilisez UTF-16LE pour toutes les données du champ mais que vous utilisez le caractère 8bit/ASCII pour la virgule ? D'après cet article ( creativyst.com/Doc/Articles/CSV/CSV01.htm#CSVAndEncodings ), Excel peut interpréter la virgule Unicode comme faisant partie des données du champ et non comme un séparateur.

1 votes

Conseil intéressant @jveazey. Je vais l'essayer : mb_convert_encoding($str, "UTF-16LE"); dans mon code d'exportation et de poster les résultats ici.

0 votes

Non pas que cela vous aide, mais j'ai testé Excel 2007 SP2 sous Windows (en utilisant Notepad2 pour créer les fichiers de test). Tout a fonctionné sauf UTF-16LE BOM (même résultat que le vôtre sous Windows) et UTF-16BE BOM (qui a analysé les champs correctement mais la BOM a été incluse dans les 2 premiers caractères de A1).

62voto

mikezter Points 1074

Encodages Excel

J'ai trouvé le WINDOWS-1252 pour être le moins frustrant dans le cadre d'Excel. Comme il s'agit essentiellement d'un jeu de caractères propriétaire de Microsoft, on peut supposer qu'il fonctionnera aussi bien sur la version Mac que sur la version Windows de MS-Excel. Les deux versions comprennent au moins un sélecteur "Origine du fichier" ou "Encodage du fichier" qui lit correctement les données.

En fonction de votre système et des outils que vous utilisez, cet encodage pourrait également être appelé CP1252 , ANSI , Windows (ANSI) , MS-ANSI ou simplement Windows parmi d'autres variantes.

Ce codage est un sur-ensemble de ISO-8859-1 (alias LATIN1 et d'autres), afin que vous puissiez vous rabattre sur les éléments suivants ISO-8859-1 si vous ne pouvez pas utiliser WINDOWS-1252 pour une raison quelconque. Sachez que ISO-8859-1 manque certains caractères de WINDOWS-1252 comme 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 le panneau euro est manquant . Ce tableau peut être consulté à l'adresse suivante Alan Wood .

Conversion

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

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

6 votes

C'est un peu compliqué, mais cela semble être la solution pour importer des fichiers .csv avec des caractères européens dans Excel sous Mac OSX.

1 votes

C'est vrai. Cela répond plutôt à la question de l'OP. Dans votre cas, vous devez d'abord connaître (ou deviner) l'encodage utilisé dans votre ".csv file with european characters". Vous pouvez ensuite le convertir en WINDOS-1252 qui sera très probablement interprété correctement par Excel sous Mac et Windows.

2 votes

Ce n'est pas une vraie solution, tôt ou tard vous rencontrerez un caractère qui n'est pas convertible en Windows-1252.

27voto

Duncan Smart Points 9195

Pour UTF-16LE avec BOM, 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 utilise en fait son analyseur syntaxique Unicode *.txt.

Caveat : Si le fichier est édité dans Excel et sauvegardé, il sera sauvegardé en ASCII délimité par des tabulations. Le problème est que lorsque vous rouvrez le fichier, Excel suppose qu'il s'agit d'un vrai CSV (avec des virgules), voit qu'il n'est pas Unicode, et l'analyse donc comme étant délimité par des virgules - et donc en fait un hachage !

Mise à 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 éditez et quittez Excel (essaie d'enregistrer sous 'Unicode *.txt')

par rapport à :

  • édition et clôture juste le fichier (fonctionne comme prévu).

1 votes

C'est bien, mais l'avertissement me fait perdre la solution ; les utilisateurs finaux ne seront pas satisfaits des feuilles Excel brisées.

0 votes

Si vous changez l'extension initiale du fichier en *.txt, cela pourrait fonctionner, mais vous perdriez alors l'association entre le type de fichier et Excel : c'est-à-dire qu'ils ne pourraient pas double-cliquer sur le fichier pour qu'il s'ouvre automatiquement dans Excel.

0 votes

Ça ne marchera pas pour moi. N'ayant pas de connaissances en informatique, l'utilisateur final doit pouvoir l'ouvrir dans Excel sans problème.

24voto

Timm Points 578

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 puce que vous faites. Je serais heureux d'entendre quelqu'un me dire le contraire !

4 votes

J'ai constaté que les encodages WIN-1252 ou ISO-8859-1 fonctionnaient. Veuillez consulter ma réponse.

3 votes

La solution consiste à utiliser l'UTF-16LE et à s'assurer que vous utilisez des tabulations pour séparer les colonnes au lieu de virgules.

0 votes

Avez-vous vraiment essayé cela sur Win et Mac Tim ? Comme je l'ai mentionné, TSV n'est pas une option dans mon cas.

4voto

brablc Points 260

La meilleure solution pour lire les fichiers CSV avec UTF-8 sur Mac est de les convertir au format XLSX. J'ai trouvé un script fait par Konrad Foerstner, que j'ai un peu amélioré en ajoutant le support de différents caractères de délimitation.

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

2voto

user525081 Points 21

Il semble dans mon cas qu'Excel 2011 pour Mac OS n'utilise pas Encoding.GetEncoding("10000") comme je le pensais et j'ai perdu 2 jours avec le même iso que sur Microsoft OS. La meilleure preuve de cela est de créer un fichier dans Excel 2011 pour MAC avec des caractères spéciaux, de l'enregistrer en tant que CSV et de l'ouvrir ensuite dans un é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 a des caractères spéciaux européens occidentaux à l'intérieur :

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

0 votes

Quelle langue utilisez-vous @user525081 ? Pouvez-vous le traduire en PHP ?

0 votes

@Timm cela ressemble à un échantillon Java mais en PHP, vous pouvez utiliser iconv pour faire la conversion -. de3.php.net/manual/fen/function.iconv.php

0 votes

OK @user525081, même chose 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 originale - un encodage qui fonctionne sur les deux plateformes. Merci.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X