Qual codificação abre arquivos CSV corretamente com o Excel no Mac e no Windows?

137

Temos um aplicativo da web que exporta arquivos CSV contendo caracteres estrangeiros com UTF-8, sem BOM. Usuários de Windows e Mac obtêm caracteres ilegíveis no Excel. Eu tentei converter para UTF-8 com BOM; Excel / Win é bom com isso, Excel / Mac mostra sem sentido. Estou usando o Excel 2003 / Win, Excel 2011 / Mac. Aqui estão todas as codificações que tentei:

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

O melhor é UTF-16LE com BOM, mas o CSV não é reconhecido como tal. O separador de campos é vírgula, mas o ponto e vírgula não muda as coisas.

Existe alguma codificação que funcione nos dois mundos?

Timm
fonte
1
E se você usar UTF-16LE para todos os dados do campo, mas usar o caractere 8bit / ASCII para a vírgula? Com base neste artigo ( creativyst.com/Doc/Articles/CSV/CSV01.htm#CSVAndEncodings ), o Excel pode interpretar a vírgula Unicode como parte dos dados do campo em vez do separador.
Jveazey
1
Dica interessante @jveazey. Vou tentar o seguinte: mb_convert_encoding($str, "UTF-16LE");no meu código de exportação e postar os resultados aqui.
Timm
Não que isso ajude você, mas testei o Excel 2007 SP2 no Windows (usando o Notepad2 para criar os arquivos de teste). Tudo funcionou, exceto a BOM UTF-16LE (o mesmo resultado que o seu no Windows) e a BOM UTF-16BE (que analisou os campos corretamente, mas a BOM foi incluída como os 2 primeiros caracteres em A1).
precisa saber é o seguinte
Além disso, encontrei este stackoverflow.com/questions/155097/…
jveazey
@hveazey, a pergunta citada tem uma resposta creechy recomendando a página de código Windows-1252. Isso não funcionou para o meu caso (tremados alemães e afiados).
Timm

Respostas:

61

Codificações do Excel

Achei a WINDOWS-1252codificação a menos frustrante ao lidar com o Excel. Como seu conjunto de caracteres proprietários, basicamente da Microsofts, pode-se presumir que funcionará tanto na versão para Mac quanto na Windows do MS-Excel. Ambas as versões incluem pelo menos um seletor "Origem do arquivo" ou "Codificação do arquivo" correspondente, que lê os dados corretamente.

Dependendo do seu sistema e as ferramentas que você usa, essa codificação também poderia ser nomeado CP1252, ANSI, Windows (ANSI), MS-ANSIou apenas Windows, entre outras variações.

Essa codificação é um superconjunto de ISO-8859-1(aka LATIN1e outros), portanto, você pode fazer o fallback ISO-8859-1se não puder usá-lo WINDOWS-1252por algum motivo. Esteja ciente de que ISO-8859-1faltam alguns caracteres, WINDOWS-1252como mostrado aqui:

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

Observe que o sinal do euro está ausente . Esta tabela pode ser encontrada em Alan Wood .

Conversão

A conversão é feita de maneira diferente em todas as ferramentas e idiomas. No entanto, suponha que você tenha um arquivo query_result.csvque você sabe que está UTF-8codificado. Converta-o para WINDOWS-1252usar iconv:

iconv -f UTF-8 -t WINDOWS-1252 query_result.csv > query_result-win.csv
mikezter
fonte
6
Um pouco de faff, mas esta não parece ser a resposta para importar arquivos .csv com caracteres europeus em Excel no Mac OSX
Fergie
1
Verdade. Responde à pergunta do OP. No seu caso, você primeiro precisa conhecer (ou adivinhar) a codificação usada no seu "arquivo .csv com caracteres europeus". Em seguida, você pode convertê-lo em WINDOS-1252, o que provavelmente será interpretado corretamente pelo Mac e pelo Windows Excel.
Mikezter
1
Esta não é uma solução real, mais cedo ou mais tarde você encontrará um caractere que não é conversível no WINDOWS-1252.
Walter Tross
2
WINDOWS-1252 falhará se houver caracteres chineses. Parece que o UTF-16LE com BOM é a única opção.
XWang 5/05
Isso funciona bem para exportações de dados SQL com sinais diacríticos.
Motorbaby #
26

Para UTF-16LE com BOM, se você usar caracteres de tabulação como delimitadores, em vez de vírgulas, o Excel reconhecerá os campos. A razão pela qual isso funciona é que o Excel realmente acaba usando seu analisador Unicode * .txt.

Advertência : Se o arquivo for editado no Excel e salvo, ele será salvo como ASCII delimitado por tabulação. O problema agora é que, quando você reabre o arquivo, o Excel assume que é um CSV real (com vírgulas) e vê que não é Unicode; portanto, o analisa como delimitado por vírgula - e, portanto, fará um hash!

Atualização : A advertência acima não parece estar acontecendo comigo hoje no Excel 2010 (Windows), pelo menos, embora pareça haver uma diferença no comportamento de salvar se:

  • você edita e sai do Excel (tenta salvar como 'Unicode * .txt')

comparado com:

  • editar e fechar apenas o arquivo (funciona conforme o esperado).
Duncan Smart
fonte
1
Legal, mas a ressalva quebra a solução para mim; os usuários finais não ficarão satisfeitos com as folhas do Excel quebradas.
Timm
Possivelmente, se você alterar a extensão do arquivo inicial para * .txt, ela funcionará, mas você perderá a associação entre o tipo de arquivo e o Excel: ou seja, eles não poderão clicar duas vezes no arquivo e abri-lo automaticamente no Excel.
Duncan Inteligente
Isso não vai funcionar para mim. Não sendo conhecedor de computadores, o usuário final precisa abri-lo no Excel sem nenhum obstáculo.
Timm
Tenho minhas planilhas do Excel ".csv" com caracteres especiais e campos separados. Inicio minha string de saída com "\ ufeff" como BOM (marca de ordem de bytes), depois usando as guias "\ t" no lugar de vírgulas para a separação de campos e codificando o arquivo com "utf-16LE". Funciona como um encanto, graças a esta página!
Geek Stocks
A primeira linha sep=,e a codificação UTF16LE funcionaram para mim e não exigiram um caractere separador diferente (continuava sendo vírgula). Abrir o arquivo clicando duas vezes carregou o arquivo corretamente, com caracteres especiais e quebras de linha nas células intactas. Desvantagem: o sep=,cabeçalho não é reconhecido por nenhum programa, exceto o Excel, até onde eu já vi. Mas o OpenOffice / LibreOffice não exige esse hack de qualquer maneira (as quebras de linha no conteúdo da célula funcionam muito bem, enquanto o carregamento do arquivo de texto / o uso do texto nas colunas do assistente no Excel não manipula adequadamente as quebras de linha nas células).
CodeManX
24

O ponto baixo é: não há solução. O Excel 2011 / Mac não pode interpretar corretamente um arquivo CSV contendo trema e sinais diacríticos, independentemente da codificação ou salto em arco que você faz. Ficaria feliz em ouvir alguém me dizer diferente!

Timm
fonte
4
Eu encontrei as codificações WIN-1252 ou ISO-8859-1 em funcionamento. Por favor, veja minha resposta.
Mikezter
3
A solução é usar UTF-16LE e garantir que você esteja usando guias para separar colunas em vez de vírgulas.
Tim Groeneveld
Você realmente tentou isso no Win e Mac Tim? Como mencionei, o TSV não é uma opção no meu caso.
Timm
1
Para mim, a exportação funciona bem se eu usar a codificação WIN-1252, nas versões Mac e Windows do Excel. @ Timm, considere alterar a resposta aceita.
Pierre Arnaud
2
Para aqueles que acharam este trabalho, você realmente estendeu caracteres (como chineses) em seus conjuntos de dados? A codificação WIN-1252 é interrompida por estar fora do intervalo.
Bill Leeper
11

Você tentou apenas o CSV separado por vírgula e ponto-e-vírgula. Se você tivesse tentado CSV separado por tabulação (também chamado TSV), teria encontrado a resposta:

UTF-16LE com BOM (marca de ordem dos bytes), separada por tabulação


Mas : em um comentário, você menciona que o TSV não é uma opção para você (ainda não consegui encontrar esse requisito na sua pergunta). É uma pena. Isso geralmente significa que você permite a edição manual de arquivos TSV, o que provavelmente não é uma boa ideia. A verificação visual de arquivos TSV não é um problema. Além disso, os editores podem ser configurados para exibir um caractere especial para marcar guias.

E sim, eu tentei isso no Windows e Mac.

Walter Tross
fonte
4

Aqui está o argumento decisivo para a importação de CSV codificado em utf8 para o Excel 2011 para Mac: A Microsoft diz: "O Excel para Mac atualmente não suporta UTF-8". Excel para Mac 2011 e UTF-8

Yay, muito bem MS!

Timm
fonte
4

A melhor solução para a leitura de arquivos CSV com UTF-8 no Mac é convertê-los para o formato XLSX. Eu encontrei um script feito por Konrad Foerstner, que melhorei um pouco ao adicionar suporte para diferentes caracteres delimitadores.

Faça o download do script no Github https://github.com/brablc/clit/blob/master/csv2xlsx.py . A fim de executá-lo você precisará instalar um módulo python openpyxl para manipulação de arquivos Excel: sudo easy_install openpyxl.

brablc
fonte
3

No meu caso, isso funcionou (Mac, Excel 2011, caracteres cirílicos e latinos com diacríticos tchecos):

  • Charset UTF-16LE (simplesmente UTF-16 não foi suficiente)
  • BOM "\ xFF \ xFE"
  • \ t (tab) como separador
  • Não se esqueça de codificar também separador e CRLFs :-)
  • Use iconv em vez de mb_convert_encoding
Marek Demčák
fonte
2

Parece que o Excel 2011 para Mac OS não está usando Encoding.GetEncoding ("10000") como eu pensava e perdi 2 dias com o mesmo iso do Microsoft OS. A melhor prova disso é criar um arquivo no Excel 2011 para MAC com caracteres especiais, salvá-lo como CSV e abri-lo no editor de texto MAC e os caracteres serão embaralhados.

Para mim, essa abordagem funcionou - o que significa que a exportação de CSV no Excel 2011 no MAC OS possui caracteres especiais da Europa Ocidental 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);
user525081
fonte
Qual idioma você está usando @ user525081? Você pode traduzi-lo para PHP?
Timm
@Timm que se parece com uma amostra de Java, mas em PHP você pode usar iconv para fazer a conversão - de3.php.net/manual/en/function.iconv.php
Ashish Datta
OK @ user525081, o mesmo acordo que as outras respostas. Isso serve para usuários de Mac, deixando as pessoas do Windows em apuros; e não responde à pergunta original - uma codificação que funciona nas duas plataformas. Obrigado.
Timm
2

Atualmente, o UTF-8 sem BOM funciona para mim no Excel Mac 2011 14.3.2.

UTF-8 + BOM meio que funciona, mas a BOM é renderizada como sem sentido.

O UTF-16 funciona se você importar o arquivo e concluir o assistente, mas não se você clicar duas vezes nele.

Craig Stuntz
fonte
2

O seguinte funcionou para mim no Excel para Mac 2011 e Windows Excel 2002:

  1. Usando iconv no Mac, converta o arquivo em UTF-16 Little-Endian + chame-o de * .txt (a extensão .txt força o Excel a executar o Assistente de Importação de Texto):

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

  2. Abra o arquivo no Excel e, no Assistente de importação de texto, escolha:

    • Etapa 1: Origem do arquivo : ignore, não importa o que você escolher
    • Etapa 2: selecione valores adequados para delimitadores e qualificador de texto
    • Etapa 3: se necessário, selecione os formatos das colunas

PS O UTF-16LE criado por iconv possui bytes de BOM FF FE no início.

PPS Meu arquivo csv original foi criado em um computador com Windows 7, no formato UTF-8 (com os bytes da BOM EF BB BF no início) e usou quebras de linha CRLF. Vírgula foi usada como delimitador de campo e aspas simples como qualificador de texto. Continha letras ASCII, além de letras latinas diferentes, com tildes, trema etc., além de algumas cirílicas. Tudo exibido corretamente no Excel para Win e Mac.

PPPS Versões exatas de 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

Koit Saarevet
fonte
Se você tem um arquivo UTF-8 sem BOM, iconv irá convertê-lo para UTF-16LE sem BOM (e, infelizmente, não há nenhuma maneira de dizer iconv para adicionar um)
Walter Tross
2

No meu Mac OS, o Text Wrangler identificou um arquivo CSV criado com o Excel como tendo codificação "Western".

Depois de pesquisar no Google, criei esse pequeno script (não tenho certeza da disponibilidade do Windows, talvez com o 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
fonte
Esta é a única coisa que funcionou para mim no OS X 10.14.2 (e Excel 2011)
Donald
1

No meu caso, adicionar o preâmbulo ao arquivo resolveu meu 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");
navalha
fonte
0

em vez de csv, tentando gerar html com uma extensão XLS e o tipo mime "application / excel". Sei que isso funcionará no Windows, mas não posso falar pelo MacOS

royce3
fonte
Obrigado @ royce23, mas estou apenas oferecendo o arquivo CSV para download. Eu não posso apresentá-lo através de HTTP porque o tamanho da marcação iria atrasar a resposta para um rastreamento - a tabela exportada pode conter milhões de linhas ...
Timm
com css, seu html seria apenas uma fração minúscula maior que csv, por exemplo: <r><c>id</c><c> name</c><c>phone</c> </r>
royce3
Não sei se entendi, mas estou salvando o CSV no servidor e oferecendo um link para download. Gerar uma resposta HTML engole muita memória PHP ...
Timm
Este trabalho vontade (o UTF-8 caracteres), mas se você tiver incorporado quebras de linha dentro das células ( brtag), o Excel para Mac ignora os (funciona com Windows) CSS mso-data-placement:same-cell;
Cropredy
0

Isso funciona para mim

  1. Abra o arquivo no BBEdit ou no TextWrangler *.
  2. Defina o arquivo como Unicode (UTF-16 Little-Endian) (os finais de linha podem ser Unix ou Windows). Salve !
  3. No Excel: Dados> Obter Dados Externos> Importar Arquivo de Texto ...

Agora, o ponto principal, escolha MacIntosh como origem do arquivo (deve ser a primeira opção).

Isso está usando o Excel 2011 (versão 14.4.2)

* Há um pequeno menu suspenso na parte inferior da janela

Gazzer
fonte
0

Resolva isso usando java (UTF-16LE com BOM):

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

Observe que o arquivo CSV deve ser usado TABcomo separador. Você pode ler o arquivo CSV no Windows e no MAC OS X.

Consulte: Como codificar / decodificar matrizes de bytes UTF-16LE com uma lista técnica?

bluearrow
fonte