¿Qué codificación abre los archivos CSV correctamente con Excel tanto en Mac como en Windows?


Tenemos una aplicación web que exporta archivos CSV que contienen caracteres extranjeros con UTF-8, sin BOM. Tanto los usuarios de Windows como los de Mac obtienen caracteres basura en Excel. Traté de convertir a UTF-8 con BOM; Excel/Win está bien con él, Excel/Mac muestra galimatías. Estoy usando Excel 2003 / Win, Excel 2011 / Mac. Aquí están todas las codificaciones que probé:

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

El mejor es UTF-16LE con BOM, pero el CSV no se reconoce como tal. El separador de campo es coma, pero punto y coma no cambia cosa.

¿Hay alguna codificación que funcione en ambos mundos?

Author: Timm, 2011-07-05

15 answers

Codificaciones de Excel

Encontré que la codificación WINDOWS-1252 es la menos frustrante cuando se trata de Excel. Dado que su conjunto de caracteres es básicamente propio de Microsofts, se puede suponer que funcionará tanto en la versión Mac como en la versión Windows de MS-Excel. Ambas versiones incluyen al menos un selector correspondiente de "Origen del archivo" o "Codificación del archivo" que lee correctamente los datos.

Dependiendo de su sistema y las herramientas que utilice, esta codificación también podría ser llamado CP1252, ANSI, Windows (ANSI), MS-ANSI o simplemente Windows, entre otras variaciones.

Esta codificación es un superconjunto de ISO-8859-1 (también conocido como LATIN1 y otros), por lo que puede recurrir a ISO-8859-1 si no puede usar WINDOWS-1252 por alguna razón. Tenga en cuenta que ISO-8859-1 falta algunos caracteres de WINDOWS-1252 como se muestra aquí:

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

Tenga en cuenta que el signo del euro falta. Esta tabla se puede encontrar en Alan Wood.

Conversión

La conversión se hace de manera diferente en cada herramienta y lenguaje. Sin embargo, supongamos que tener un archivo query_result.csv que sabes que está codificado UTF-8. Convertir a WINDOWS-1252 usando iconv:

iconv -f UTF-8 -t WINDOWS-1252 query_result.csv > query_result-win.csv
 55
Author: mikezter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-11-25 13:31:07

Para UTF-16LE con BOM si usa caracteres de tabulación como delimitadores en lugar de comas, Excel reconocerá los campos. La razón por la que funciona es que Excel en realidad termina usando su Unicode *.analizador txt.

Advertencia: Si el archivo se edita en Excel y se guarda, se guardará como ASCII delimitado por tabulaciones. El problema ahora es que cuando vuelve a abrir el archivo Excel asume que es CSV real (con comas), ve que no es Unicode, por lo que lo analiza como delimitado por comas, y por lo tanto hará un ¡hachís!

Actualización : La advertencia anterior no parece estar sucediendo para mí hoy en Excel 2010 (Windows) al menos, aunque parece haber una diferencia en el comportamiento de ahorro si:

  • edita y sale de Excel (intenta guardar como 'Unicode *.txt')

Comparado con:

  • editar y cerrar solo el archivo (funciona como se esperaba).
 25
Author: Duncan Smart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-09-13 13:27:32

La verdad es: No hay solución. Excel 2011 / Mac no puede interpretar correctamente un archivo CSV que contiene diéresis y marcas diacríticas sin importar la codificación o el salto de aro que haga. ¡Me alegraría oír a alguien decirme lo contrario!

 20
Author: Timm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-01-30 21:06:50

Solo has probado CSV separados por comas y por punto y coma. Si hubieras probado CSV separados por pestañas (también llamado TSV) habrías encontrado la respuesta:

UTF-16LE with BOM (byte order mark), tab-separated


Pero: En un comentario mencionas que TSV no es una opción para ti (aunque no he podido encontrar este requisito en tu pregunta). Es una pena. A menudo significa que permite la edición manual de archivos TSV, que probablemente no sea una buena idea. La comprobación visual de los archivos TSV no es un problema. Además, los editores se pueden configurar para mostrar un carácter especial para marcar pestañas.

Y sí, probé esto en Windows y Mac.

 8
Author: Walter Tross,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-13 19:14:35

La mejor solución para leer archivos CSV con UTF-8 en Mac es convertirlos en formato XLSX. He encontrado un script hecho por Konrad Foerstner, que he mejorado un poco añadiendo soporte para diferentes caracteres delimitadores.

Descarga el script desde Github https://github.com/brablc/clit/blob/master/csv2xlsx.py. Para ejecutarlo necesitará instalar un módulo python openpyxl para la manipulación de archivos de Excel: sudo easy_install openpyxl.

 4
Author: brablc,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-06-29 23:08:58

Aquí está la clave para importar CSV codificados con utf8 en Excel 2011 para Mac: Microsoft dice: "Excel para Mac actualmente no admite UTF-8." Excel para Mac 2011 y UTF-8

¡Bien hecho, señorita!
 3
Author: Timm,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-02-18 18:54:38

Me parece que Excel 2011 para Mac OS no está usando codificación.GetEncoding("10000") como pensé y desperdicié 2 días con pero el mismo iso que en Microsoft OS. La mejor prueba de esto es hacer un archivo en Excel 2011 para MAC con caracteres especiales, guardarlo como CSV y luego abrirlo en el editor de texto de MAC y los caracteres se codifican.

Para mí este enfoque funcionó, lo que significa que la exportación csv en Excel 2011 en MAC OS tiene caracteres especiales de Europa occidental dentro:

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);
 2
Author: user525081,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-10-14 12:05:18

UTF-8 sin lista de materiales actualmente funciona para mí en Excel Mac 2011 14.3.2.

UTF-8 + BOM tipo de obras, pero BOM renderizado como galimatías.

UTF-16 funciona si importa el archivo y completa el asistente, pero no si simplemente hace doble clic en él.

 2
Author: Craig Stuntz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-01 20:56:59

Lo siguiente funcionó para mí en Excel para Mac 2011 y Windows Excel 2002:

  1. Usando iconv en Mac, convierte el archivo a UTF-16 Little-Endian + nómbralo *.txt (the .la extensión txt obliga a Excel a ejecutar el Asistente de Importación de Texto):

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

  2. Abra el archivo en Excel y en el Asistente para importación de texto elija:

    • Paso 1: Origen del archivo : ignóralo, no importa lo que elijas
    • Paso 2: seleccione los valores adecuados para Delimitadores y calificador de Texto
    • Paso 3: si es necesario, seleccione formatos de columna

PS El UTF-16LE creado por iconv tiene BOM bytes FF FE al principio.

PPS Mi archivo csv original fue creado en una computadora con Windows 7, en formato UTF-8 (con los bytes BOM EF BB BF al principio) y usaba saltos de línea CRLF. La coma se utilizó como delimitador de campo y la comilla simple como calificador de texto. Contenía letras ASCII más diferentes latinas letras con tildes, diéresis, etc, además de algunas cirílicas. Todo se muestra correctamente en Excel para Win y Mac.

PPPS Versiones exactas del software:
* Mac OS X 10.6.8
* Excel para Mac 2011 v.14.1. 3
* Windows Server 2003 SP2
* Windows Excel 2002 v.10.2701. 2625

 2
Author: user3137513,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-12-29 21:58:26

En mi caso esto funcionó (Mac, Excel 2011, ambos caracteres cirílicos y latinos con diacríticos checos):

  • Charset UTF-16LE (simplemente UTF-16 no era suficiente)
  • BOM "\xFF\xFE "
  • \t (tab) como separador
  • No se olvide de codificar también separador y CRLFs: -)
  • Utilice iconv en lugar de mb_convert_encoding
 2
Author: Marek Demčák,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-15 19:15:55

En mi Mac OS, Text Wrangler identificó un archivo CSV creado con Excel con codificación "Occidental".

Después de buscar en Google he hecho este pequeño script (no estoy seguro de la disponibilidad de Windows, tal vez con Cygwin?):

Cat 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
 1
Author: user243202,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-15 18:55:35

En lugar de csv, intenta generar html con una extensión XLS y el tipo mime "application/excel". Sé que esto funcionará en Windows, pero no puedo hablar de macOS

 0
Author: royce3,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-08-08 20:36:10

Esto funciona para mí

  1. Abra el archivo en BBEdit o TextWrangler*.
  2. Establezca el archivo como Unicode (UTF-16 Little-Endian) (Los finales de línea pueden ser Unix o Windows). ¡Salven!
  3. En Excel: Datos > Obtener datos externos > Importar Archivo De Texto...

Ahora el punto clave, elija MacIntosh como Origen del archivo (debería ser la primera opción).

Esto está usando Excel 2011 (versión 14.4.2)

* Hay un pequeño menú desplegable en la parte inferior de la ventana

 0
Author: Gazzer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-08-29 05:33:58

Resuelve esto usando java (UTF-16LE con BOM):

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

Tenga en cuenta que el archivo CSV debe usar TAB como separador. Puede leer el archivo CSV tanto en Windows como en MAC OS X.

Refiérase a: ¿Cómo puedo codificar/decodificar matrices de bytes UTF-16LE con una lista de materiales?

 0
Author: bluearrow,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:17

En mi caso agregar Preámbulo al archivo resolvió mi 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
Author: razon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-06 13:22:13