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, Pas de BOM. Les utilisateurs de Windows et de Mac obtiennent des caractères d'ordures dans Excel. J'ai essayé de convertir en UTF-8 avec BOM; Excel / Win est d'accord avec cela, Excel/Mac montre du charabia. J'utilise Excel 2003 / Win, Excel 2011 / Mac. Voici tous les encodages que j'ai essayé:
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 virgule, Mais point-virgule n'est pas de changer les choses.
y a-t-il un encodage qui fonctionne dans les deux mondes?
15 réponses
Excel Codages
j'ai trouvé l'encodage WINDOWS-1252
le moins frustrant quand il s'agit D'Excel. Étant donné que son jeu de caractères propriétaire est essentiellement Microsofts, on peut supposer qu'il fonctionnera à la fois sur la version Mac et Windows DE MS-Excel. Les deux versions comprennent au moins un sélecteur correspondant "File origin" ou "File encoding" qui lit correctement les données.
selon votre système et les outils que vous utilisez, ce l'encodage pourrait aussi être nommé CP1252
, ANSI
, Windows (ANSI)
, MS-ANSI
ou tout simplement Windows
, entre autres variantes.
cet encodage est un super-ensemble de ISO-8859-1
(alias LATIN1
et autres), donc vous pouvez revenir à ISO-8859-1
si vous ne pouvez pas utiliser WINDOWS-1252
pour une raison quelconque. Sachez que ISO-8859-1
manque quelques caractères de WINDOWS-1252
comme montré 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 euro il manque le panneau . Ce tableau se trouve à Alan Wood .
Conversion
La Conversion se fait différemment dans chaque outil et chaque langue. Cependant, supposons que vous ayez un fichier query_result.csv
dont vous savez qu'il est codé UTF-8
. Convertissez-le en WINDOWS-1252
en utilisant iconv
:
iconv -f UTF-8 -t WINDOWS-1252 query_result.csv > query_result-win.csv
pour UTF-16LE avec BOM si vous utilisez les caractères tab comme vos délimiteurs au lieu des virgules Excel reconnaîtra les champs. La raison pour laquelle cela fonctionne est que Excel finit en fait par utiliser son Unicode *.txt analyseur.
Caveat : si le fichier est édité dans Excel et sauvegardé, il sera sauvegardé sous forme d'ASCII délimité par des onglets. Le problème maintenant est que lorsque vous ré-ouvrez le fichier Excel suppose que C'est réel CSV (avec des virgules), voit que ce n'est pas Unicode, donc le parse comme délimité par des virgules - et donc fera un hachage de celui-ci!
Update : 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'épargne si:
- vous éditez et quittez Excel (essaie d'Enregistrer sous 'Unicode *.txt')
comparé à:
- montage et fermeture juste le fichier (fonctionne comme prévu).
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 umlauts et des marques diacritiques, quel que soit l'encodage ou le saut de cerceau que vous faites. Je serais heureux d'entendre quelqu'un me dire différent!
Vous n'avez essayé séparées par des virgules et des points-virgules CSV séparé. Si vous aviez essayé CSV (aussi appelé TSV) séparé des onglets, vous auriez trouvé la réponse:
UTF-16LE avec BOM (byte order mark), séparé par des tabulations
mais : dans un commentaire vous mentionnez que TSV n'est pas une option pour vous (je n'ai pas été en mesure de trouver cette exigence dans votre question). C'est bien dommage. Cela signifie souvent que vous autorisez l'édition manuelle de 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. De plus, les éditeurs peuvent afficher un caractère spécial pour marquer les onglets.
et oui, J'ai essayé ça sur Windows et Mac.
la meilleure solution pour contourner la lecture des fichiers CSV avec UTF-8 sur Mac est de les convertir en format XLSX. J'ai trouvé un script réalisé par Konrad Foerstner, que j'ai légèrement amélioré en ajoutant un support pour différents caractères de délimiteur.
Téléchargez le script de Github https://github.com/brablc/clit/blob/master/csv2xlsx.py . Pour l'exécuter, vous devez installer un module python openpyxl pour le fichier Excel manipulation: sudo easy_install openpyxl
.
Voici la preuve sur l'importation de CSV encodé utf8 dans Excel 2011 Pour Mac: Microsoft dit: "Excel pour Mac ne supporte pas actuellement UTF-8." Excel 2011 pour Mac et UTF-8
Yay, le chemin à parcourir MS!
il me semble que Excel 2011 Pour Mac OS n'utilise pas L'encodage.GetEncoding ("10000") comme je l'ai pensé et perdu 2 jours avec mais la même iso que sur Microsoft OS. La meilleure preuve pour cela est de faire un fichier dans Excel 2011 Pour MAC avec des caractères spéciaux, le sauver comme CSV et puis l'ouvrir dans Mac Text editor et les caractères sont brouillés.
pour moi cette approche a fonctionné - ce qui signifie que csv export sur Excel 2011 sur MAC OS a des caractères spéciaux d'Europe de l'ouest à 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);
UTF-8 sans BOM fonctionne actuellement pour moi dans Excel Mac 2011 14.3.2.
UTF-8 + BOM genre de travaux, mais BOM rendu comme charabia.
UTF-16 fonctionne si vous importez le fichier et compléter l'assistant, mais pas si vous venez de double-cliquer dessus.
ce qui suit a travaillé pour moi sur Excel pour Mac 2011 et Windows Excel 2002:
-
en utilisant iconv sur Mac, convertir le fichier en UTF-16 Little-Endian + le nommer *.txt (l' .txt extension des forces Excel pour exécuter l'Assistant Importation de Texte):
iconv -f UTF-8 -t UTF-16LE filename.csv >filename_UTF-16LE.csv.txt
-
ouvrir le fichier dans Excel et dans L'Assistant D'importation de texte choisir:
- Étape 1: Origine du fichier : ignorez-le, peu importe ce que vous choisissez
- Étape 2: Sélectionner les valeurs appropriées pour délimiteurs et qualificatif du texte
- Étape 3: si nécessaire, choisir le format des colonnes
PS de L'UTF-16LE créé par iconv a BOM octets FF FE au début.
PPS mon fichier csv original était créé sur un ordinateur Windows 7, dans le format UTF-8 (avec les octets BOM EF BB BF au début) et utilisé des sauts de ligne CRLF. La virgule a été utilisée comme délimiteur de champ et la citation simple comme qualificatif de texte. Il contient des lettres ASCII plus différentes lettres latines avec des tildes, umlaut etc, plus certains Cyrillique. Tous affichés correctement dans les deux Excel pour Win et Mac.
PPP Exacte des versions du logiciel:
* Mac OS X 10.6.8
* Excel pour Mac 2011 c. 14.1.3
* Windows Server 2003 SP2
* Windows Excel 2002 v. 10.2701.2625
dans mon cas cela a fonctionné (Mac, Excel 2011, à la fois caractères cyrilliques et latins avec des signes diacritiques Tchèques):
- Charset UTF-16LE (tout simplement UTF-16 n'était pas suffisant)
- BOM" \xFF\xFE"
- \t (tab) comme séparateur
- N'oubliez pas d'encoder aussi séparateur et CRLFs: -)
- utiliser iconv au lieu de mb_convert_encoding
sur mon Mac OS, Text Wrangler a identifié un fichier CSV créé avec Excel comme ayant un encodage" Western".
après quelques recherches sur Google j'ai fait 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=""
iconv -f macroman -c -t UTF-8 $INPUTFILE |tr '\r' '\n' >/tmp/file.$$.csv
mv $INPUTFILE ms_trash
mv /tmp/file.$$.csv $INPUTFILE
au lieu de csv, en essayant la sortie html avec une extension XLS et le type mime" application/excel". Je sais que cela va fonctionner dans Windows, mais ne peux pas parler pour MacOS
Cela fonctionne pour moi
- ouvrir le fichier dans BBEdit or TextWrangler*.
- définit le fichier comme Unicode (UTF-16 Little-Endian) (les fins de ligne peuvent être Unix ou Windows). Sauver!!!
- Dans Excel: Les Données > Données Externes > Importer Un Fichier Texte...
maintenant le point clé, choisissez MacIntosh comme Origine du fichier (Ce devrait être le premier choix).
Ceci utilise Excel 2011 (version 14.4.2)
*Il y a un petit menu déroulant en bas de la fenêtre
résoudre ce 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 sur windows et MAC OS X.
se Référer à: Comment puis-je encoder/décoder UTF-16LE tableaux d'octets avec un BOM?
dans mon cas l'ajout de préambule au dossier 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");