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

137

Tenemos una aplicación web que exporta archivos CSV que contienen caracteres extranjeros con UTF-8, sin BOM. Tanto los usuarios de Windows como de Mac obtienen caracteres basura en Excel. Traté de convertir a UTF-8 con BOM; Excel / Win está bien con eso, 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 una coma, pero el punto y coma no cambia las cosas.

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

Timm
fuente
1
¿Qué sucede si usa UTF-16LE para todos los datos de campo pero usa el carácter de 8 bits / ASCII para la coma? Según este artículo ( creativyst.com/Doc/Articles/CSV/CSV01.htm#CSVAndEncodings ), Excel podría interpretar la coma Unicode como parte de los datos del campo en lugar del separador.
jveazey
1
Consejo interesante @jveazey. Intentaré esto: mb_convert_encoding($str, "UTF-16LE");en mi código de exportación y publicaré los resultados aquí.
Timm
No es que esto te ayude, pero probé Excel 2007 SP2 en Windows (usando Notepad2 para crear los archivos de prueba). Todo funcionó excepto UTF-16LE BOM (el mismo resultado que el tuyo en Windows) y UTF-16BE BOM (que analizó los campos correctamente pero el BOM se incluyó como los primeros 2 caracteres en A1).
jveazey
Además, encontré este stackoverflow.com/questions/155097/…
jveazey
@hveazey, la pregunta citada tiene una respuesta que recomienda la página de códigos Windows-1252. Eso no funcionó para mi caso (diéresis alemanas y afiladas).
Timm

Respuestas:

61

Codificaciones de Excel

Encontré que la WINDOWS-1252codificación es la menos frustrante cuando se trata de Excel. Dado que es básicamente un conjunto de caracteres patentado 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 de archivo" o "Codificación de archivo" que lee correctamente los datos.

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

Esta codificación es un superconjunto de ISO-8859-1(aka LATIN1y otros), por lo que puede recurrir a ISO-8859-1si no puede usar WINDOWS-1252por alguna razón. Tenga en cuenta que ISO-8859-1le faltan algunos caracteres WINDOWS-1252como 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 falta el símbolo del euro . Esta tabla se puede encontrar en Alan Wood .

Conversión

La conversión se realiza de manera diferente en cada herramienta e idioma. Sin embargo, suponga que tiene un archivo query_result.csvque sabe que está UTF-8codificado. Conviértalo a WINDOWS-1252usando iconv:

iconv -f UTF-8 -t WINDOWS-1252 query_result.csv > query_result-win.csv
mikezter
fuente
66
Un poco raro, pero esta parece ser la respuesta para importar archivos .csv con caracteres europeos en Excel en Mac OSX
Fergie
1
Cierto. Responde la pregunta del OP en su lugar. En su caso, primero tendría que saber (o adivinar) la codificación utilizada en su "archivo .csv con caracteres europeos". Luego puede convertirlo a WINDOS-1252, que probablemente sea interpretado correctamente por Mac y Windows Excel.
mikezter
1
Esta no es una solución real, tarde o temprano te encontrarás con un personaje que no es convertible a WINDOWS-1252.
Walter Tross
2
WINDOWS-1252 fallará si hay caracteres chinos. Entonces parece que UTF-16LE con BOM es la única opción.
XWang
Esto funciona bien para las exportaciones de datos SQL con diacríticos.
motorbaby
26

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 analizador Unicode * .txt.

Advertencia : si el archivo se edita en Excel y se guarda, se guardará como ASCII delimitado por tabuladores. 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 lo convertirá en un hash!

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 guardado si:

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

comparado con:

  • editando y cerrando solo el archivo (funciona como se esperaba).
Duncan Smart
fuente
1
Agradable, pero la advertencia rompe la solución para mí; Los usuarios finales no estarán contentos con las hojas de Excel rotas.
Timm
Posiblemente, si cambia la extensión de archivo inicial a * .txt, funcionaría, pero luego pierde la asociación entre el tipo de archivo y Excel: es decir, no pueden hacer doble clic en el archivo y abrirlo en Excel automáticamente.
Duncan Smart
Eso no funcionará para mí. Al no ser experto en informática, el usuario final debe abrirlo en Excel sin ningún obstáculo.
Timm
Mis hojas de Excel ".csv" se ven bien con caracteres especiales y campos separados. Comienzo mi cadena de salida con "\ ufeff" como marca de orden de bytes (BOM), luego uso las pestañas "\ t" en lugar de comas para la separación de campos y codifico el archivo con "utf-16LE". Funciona como un encanto, gracias a esta página!
Geek Stocks
La primera línea sep=,y la codificación UTF16LE funcionaron para mí y no requirieron un carácter separador diferente (seguía siendo una coma). Abrir el archivo haciendo doble clic cargó el archivo correctamente, con caracteres especiales y saltos de línea dentro de las celdas intactos. Desventaja: el sep=,encabezado no es reconocido por ningún programa, excepto Excel, por lo que he visto. Pero OpenOffice / LibreOffice no requieren este truco de todos modos (los saltos de línea en el contenido de las celdas funcionan bien, mientras que cargar desde el archivo de texto / usar el asistente de texto en columnas en Excel no maneja adecuadamente los saltos de línea en las celdas).
CodeManX el
24

El detalle es: no hay solución. Excel 2011 / Mac no puede interpretar correctamente un archivo CSV que contenga diéresis y signos diacríticos, sin importar la codificación o el salto de aro que realice. ¡Me alegraría escuchar que alguien me diga diferente!

Timm
fuente
44
Encontré que las codificaciones WIN-1252 o ISO-8859-1 estaban funcionando. Por favor mira mi respuesta.
mikezter
3
La solución es usar UTF-16LE y asegurarse de usar pestañas para separar columnas en lugar de comas.
Tim Groeneveld
¿Realmente intentaste esto en Win y Mac Tim? Como mencioné, TSV no es una opción en mi caso.
Timm
1
Para mí, exportar funciona bien si uso la codificación WIN-1252, tanto en Mac como en Windows de Excel. @Timm, deberías considerar cambiar la respuesta aceptada.
Pierre Arnaud
2
Para aquellos que encontraron esto funcionando, ¿realmente tenían caracteres extendidos (como chinos) en sus conjuntos de datos? La codificación WIN-1252 se rompe en aquellos porque están fuera de rango.
Bill Leeper
11

Solo ha intentado CSV separados por comas y puntos y coma. Si hubiera intentado CSV separado por tabulaciones (también llamado TSV), habría encontrado la respuesta:

UTF-16LE con BOM (marca de orden de bytes), separados por tabuladores


Pero : en un comentario, mencionas que TSV no es una opción para ti (aunque no he podido encontrar este requisito en tu pregunta). Eso es una lástima. A menudo significa que permite la edición manual de archivos TSV, lo 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.

Walter Tross
fuente
4

Aquí está el factor decisivo sobre la importación de CSV codificado con utf8 en Excel 2011 para Mac: Microsoft dice: "Excel para Mac actualmente no es compatible con UTF-8". Excel para Mac 2011 y UTF-8

Yay, camino a seguir MS!

Timm
fuente
4

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

Descargue el script de Github https://github.com/brablc/clit/blob/master/csv2xlsx.py . Con el fin de ejecutarlo, necesitará instalar un módulo de Python openpyxl para la manipulación de archivos Excel: sudo easy_install openpyxl.

brablc
fuente
3

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

  • Charset UTF-16LE (simplemente UTF-16 no fue suficiente)
  • BOM "\ xFF \ xFE"
  • \ t (tabulador) como separador
  • No olvides codificar también separador y CRLF :-)
  • Use iconv en lugar de mb_convert_encoding
Marek Demčák
fuente
2

En mi caso, Excel 2011 para Mac OS no está utilizando Encoding.GetEncoding ("10000") como pensaba y desperdicié 2 días con la misma iso que en Microsoft OS. La mejor prueba de esto es crear un archivo en Excel 2011 para MAC con caracteres especiales, guardarlo como CSV y luego abrirlo en el editor de texto MAC y los caracteres se codifican.

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

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);
usuario525081
fuente
¿En qué idioma estás usando @ user525081? ¿Puedes traducirlo a PHP?
Timm
@Timm que parece una muestra de Java pero en PHP puede usar iconv para hacer la conversión - de3.php.net/manual/en/function.iconv.php
Ashish Datta
OK @ user525081, el mismo trato que las otras respuestas. Esto atiende a los usuarios de Mac, dejando a la gente de Windows en la estacada; y no responde la pregunta original: una codificación que funciona en ambas plataformas. Gracias.
Timm
2

UTF-8 sin BOM actualmente funciona para mí en Excel Mac 2011 14.3.2.

UTF-8 + BOM funciona, pero BOM se muestra como galimatías.

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

Craig Stuntz
fuente
2

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

  1. Usando iconv en Mac, convierta el archivo a UTF-16 Little-Endian + nómbrelo * .txt (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 de 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 se creó en una computadora con Windows 7, en formato UTF-8 (con los bytes BOM EF BB BF al principio) y se utilizaron saltos de línea CRLF. La coma se usó como delimitador de campo y comillas simples como calificador de texto. Contenía letras ASCII más diferentes letras latinas con tildes, diéresis, etc., además de algunas letras cirílicas. Todos se muestran correctamente en Excel para Win y Mac.

Versiones de software PPPS Exact:
* 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

Koit Saarevet
fuente
Si tiene un archivo UTF-8 sin BOM, iconv lo convertirá a UTF-16LE sin BOM (y desafortunadamente no hay forma de decirle a iconv que agregue uno)
Walter Tross
2

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

Después de buscar en Google, hice este pequeño script (no estoy seguro de la disponibilidad de Windows, tal vez 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
Nuno
fuente
Esto es lo único que funcionó para mí en OS X 10.14.2 (y Excel 2011)
Donald
1

En mi caso, agregar Preamble 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");
razon
fuente
0

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

royce3
fuente
Gracias @ royce23, pero solo estoy ofreciendo el archivo CSV para descargar. No puedo presentarlo a través de HTTP porque el tamaño del marcado ralentizaría la respuesta a un rastreo: la tabla exportada puede contener millones de filas ...
Timm
con css su html solo sería una pequeña fracción más grande que csv, por ejemplo: <r><c>id</c><c>name</c><c>phone</c> </r>
royce3
No estoy seguro si entiendo, pero estoy guardando el CSV en el servidor y ofreciendo un enlace de descarga. La generación de una respuesta HTML engulle demasiada memoria PHP ...
Timm
Esto funcionará (los caracteres UTF-8) pero si tiene saltos de línea incrustados dentro de las celdas ( bretiqueta), Excel para Mac ignora el CSS (funciona con Windows) mso-data-placement:same-cell;
cropredy
0

Esto funciona para mi

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

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

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

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

Gazzer
fuente