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



excel convert csv utf 8 (12)

Temos um aplicativo da Web que exporta arquivos CSV contendo caracteres estrangeiros com UTF-8, sem BOM. Usuários do Windows e do Mac recebem caracteres ilegíveis no Excel. Eu tentei converter para UTF-8 com BOM; Excel / Win é bom com isso, Excel / Mac mostra rabiscos. Estou usando o Excel 2003 / Win, Excel 2011 / Mac. Aqui estão todas as codificações que eu 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 é o UTF-16LE com BOM, mas o CSV não é reconhecido como tal. O separador de campo é vírgula, mas o ponto-e-vírgula não altera as coisas.

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


Answer #1

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

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

Mas : Em um comentário, você mencionou 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 as guias.

E sim, tentei isso no Windows e no Mac.


Answer #2

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 esqueça de codificar também o separador e os CRLFs :-)
  • Use iconv em vez de mb_convert_encoding

Answer #3

em vez de csv, tentando produzir html com uma extensão XLS e tipo mime "application / excel". Eu sei que isso vai funcionar no Windows, mas não posso falar de MacOS


Answer #4

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 é que o Excel 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ções. O problema agora é que quando você reabre o arquivo, o Excel assume que é CSV real (com vírgulas), vê que não é Unicode, então o analisa como delimitado por vírgulas - e, portanto, fará um hash dele!

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

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

comparado com:

  • editando e fechando apenas o arquivo (funciona como esperado).

Answer #5

No meu caso, adicionando Preamble ao arquivo resolveu o 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");

Answer #6

O resumo é: Não há solução. O Excel 2011 / Mac não pode interpretar corretamente um arquivo CSV contendo marcas diacríticas e tremas, independentemente da codificação ou do salto de pulo que você faz. Eu ficaria feliz em ouvir alguém me dizer diferente!


Answer #7

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

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


Answer #8

Isso funciona para mim

  1. Abra o arquivo no BBEdit ou TextWrangler *.
  2. Defina o arquivo como Unicode (UTF-16 Little-Endian) (as terminações de linha podem ser Unix ou Windows). Salve !
  3. No Excel: Dados> Obter dados externos> Importar arquivo de texto ...

Agora, o ponto-chave, escolha MacIntosh como File Origin (deve ser a primeira escolha).

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

* Há um pequeno dropdown na parte inferior da janela


Answer #9

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

Depois de algum googling eu fiz este pequeno script (não tenho certeza sobre a 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

Answer #10

Excel Encodings

Eu achei a codificação WINDOWS-1252 para ser o menos frustrante quando se lida com o Excel. Como é basicamente o próprio conjunto de caracteres proprietários da Microsoft, pode-se supor que funcionará tanto na versão Mac quanto na versão Windows do MS-Excel. Ambas as versões incluem pelo menos um seletor de "origem de arquivo" ou "codificação de arquivo" correspondente que lê corretamente os dados.

Dependendo do sistema e das ferramentas que você usa, essa codificação também pode ser denominada CP1252 , ANSI , Windows (ANSI) , MS-ANSI ou apenas Windows , entre outras variações.

Essa codificação é um superconjunto do ISO-8859-1 (também conhecido como LATIN1 e outros), portanto, é possível fazer fallback para ISO-8859-1 se você não puder usar o WINDOWS-1252 por algum motivo. Esteja ciente de que a ISO-8859-1 está faltando alguns caracteres do WINDOWS-1252 como 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         |

Note que o sinal do euro está faltando . 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.csv que você sabe que é UTF-8 . Converta-o para o WINDOWS-1252 usando o iconv :

iconv -f UTF-8 -t WINDOWS-1252 query_result.csv > query_result-win.csv

Answer #11

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 usar TAB como separador. Você pode ler o arquivo CSV no Windows e no Mac OS X.

Consulte: Como codifico / decodifico matrizes de bytes UTF-16LE com uma BOM?


Answer #12

Parece no meu caso que o Excel 2011 para Mac OS não está usando Encoding.GetEncoding ("10000") como eu pensei e perdi dois dias com a mesma iso como no Microsoft OS. A melhor prova para isso é fazer 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 estão embaralhados.

Para mim, essa abordagem funcionou - o que significa que a exportação do csv no Excel 2011 no MAC OS tem caracteres especiais especiais no interior da Europa:

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