windows - problem - excel export csv utf8
¿Qué codificación abre archivos CSV correctamente con Excel tanto en Mac como en Windows? (15)
Codificaciones de Excel
Descubrí que la codificación WINDOWS-1252
es la menos frustrante cuando se trata de Excel. Dado que es básicamente un conjunto de caracteres propio de Microsofts, se puede suponer que funcionará tanto en Mac como en la versión de 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 utilice, esta codificación también podría denominarse CP1252
, ANSI
, Windows (ANSI)
, MS-ANSI
o simplemente Windows
, entre otras variaciones.
Esta codificación es un superconjunto de ISO-8859-1
(también LATIN1
como LATIN1
y otros), por lo que puede recurrir a ISO-8859-1
si no puede usar WINDOWS-1252
por algún motivo. Tenga en cuenta que a ISO-8859-1
le faltan 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 falta el signo del euro . Esta tabla se puede encontrar en Alan Wood .
Conversión
La conversión se hace de manera diferente en cada herramienta e idioma. Sin embargo, supongamos que tiene un archivo query_result.csv
que sabe que está UTF-8
. Conviértalo en WINDOWS-1252
usando iconv
:
iconv -f UTF-8 -t WINDOWS-1252 query_result.csv > query_result-win.csv
Tenemos una aplicación web que exporta archivos CSV que contienen caracteres foráneos con UTF-8, sin BOM. Tanto los usuarios de Windows como Mac obtienen caracteres basura en Excel. Traté de convertir a UTF-8 con BOM; Excel / Win está de acuerdo 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?
Aquí está el factor decisivo en la importación de CSV con codificación 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!
En mi Mac OS, Text Wrangler identificó un archivo CSV creado con Excel con codificación "Western".
Después de googlear, hice este pequeño script (no estoy seguro de la disponibilidad de Windows, ¿quizás 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
En mi caso, al agregar Preámbulo al archivo resolví 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");
En mi caso, esto funcionó (Mac, Excel 2011, caracteres cirílicos y latinos con signos diacríticos checos):
- Charset UTF-16LE (simplemente UTF-16 no era suficiente)
- BOM "/ xFF / xFE"
- / t (tab) como separador
- No te olvides de codificar también separador y CRLFs :-)
- Use iconv en lugar de mb_convert_encoding
Esto funciona para mí
- Abra el archivo en BBEdit o TextWrangler *.
- Establezca el archivo como Unicode (UTF-16 Little-Endian) (los finales de línea pueden ser Unix o Windows). ¡Salvar!
- En Excel: Datos> Obtener datos externos> Importar archivo de texto ...
Ahora el punto clave, elija MacIntosh como Origen de archivo (debe ser la primera opción).
Esto es usando Excel 2011 (versión 14.4.2)
* Hay un pequeño menú desplegable en la parte inferior de la ventana
La mejor solución para leer archivos CSV con UTF-8 en Mac es convertirlos a formato XLSX. He encontrado un script hecho por Konrad Foerstner, que he mejorado un poco añadiendo soporte para diferentes caracteres delimitadores.
Descargue el script de Github https://github.com/brablc/clit/blob/master/csv2xlsx.py . Para ejecutarlo necesitarás instalar un módulo python openpyxl para la manipulación de archivos de Excel: sudo easy_install openpyxl
.
La verdad es: no hay solución. Excel 2011 / Mac no puede interpretar correctamente un archivo CSV que contiene diéresis y signos diacríticos, sin importar qué codificación o salto de hoyo haga. ¡Me gustaría escuchar que alguien me diga algo diferente!
Lo siguiente funcionó para mí en Excel para Mac 2011 y Windows Excel 2002:
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
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: selecciona los valores adecuados para Delimitadores y calificador de texto
- Paso 3: si es necesario, selecciona formatos de columna
PS El UTF-16LE creado por iconv tiene bytes BOM 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 usé 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 letras latinas diferentes con tildes, umlaut, etc., más algunos cirílicos. Todo se muestra correctamente en Excel for 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
Me parece que Excel 2011 para Mac OS no usa Encoding.GetEncoding ("10000") como pensé y desperdicié 2 días con la misma ISO que en el sistema operativo Microsoft. La mejor prueba para 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 están codificados.
Para mí, este enfoque funcionó, lo que significa que la exportación de csv en Excel 2011 en MAC OS tiene caracteres especiales de europe occidental dentro de:
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);
Para UTF-16LE con BOM si usa caracteres de tabulación como sus delimitadores en lugar de comas, Excel reconocerá los campos. La razón por la que funciona es que Excel realmente 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 vuelves 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 hash de él!
Actualización : La advertencia anterior no parece estar ocurriendo 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 guardar como ''Unicode * .txt'')
comparado con:
- editar y cerrar solo el archivo (funciona como se esperaba).
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 en Windows y MAC OS X.
Consulte: ¿Cómo codifico / decodifico las matrices de bytes UTF-16LE con una lista de materiales?
Solo ha intentado el archivo CSV separado por comas y por punto y coma. Si hubiera intentado CSV separado por tabuladores (también llamado TSV), habría encontrado la respuesta:
UTF-16LE con BOM (marca de orden de bytes), separado 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.
UTF-8 sin BOM actualmente funciona para mí en Excel Mac 2011 14.3.2.
El tipo UTF-8 + BOM funciona, pero el BOM se representa como un galimatías.
UTF-16 funciona si importa el archivo y completa el asistente, pero no si solo hace doble clic en él.
en lugar de csv, intente generar html con una extensión XLS y "application / excel" mime-type. Sé que esto funcionará en Windows, pero no puedo hablar por MacOS