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?
mb_convert_encoding($str, "UTF-16LE");
no meu código de exportação e postar os resultados aqui.Respostas:
Codificações do Excel
Achei a
WINDOWS-1252
codificaçã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-ANSI
ou apenasWindows
, entre outras variações.Essa codificação é um superconjunto de
ISO-8859-1
(akaLATIN1
e outros), portanto, você pode fazer o fallbackISO-8859-1
se não puder usá-loWINDOWS-1252
por algum motivo. Esteja ciente de queISO-8859-1
faltam alguns caracteres,WINDOWS-1252
como mostrado aqui: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.csv
que você sabe que estáUTF-8
codificado. Converta-o paraWINDOWS-1252
usariconv
:fonte
WINDOS-1252
, o que provavelmente será interpretado corretamente pelo Mac e pelo Windows Excel.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:
comparado com:
fonte
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: osep=,
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).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!
fonte
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.
fonte
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!
fonte
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
.fonte
No meu caso, isso funcionou (Mac, Excel 2011, caracteres cirílicos e latinos com diacríticos tchecos):
fonte
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:
fonte
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.
fonte
O seguinte funcionou para mim no Excel para Mac 2011 e Windows Excel 2002:
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
Abra o arquivo no Excel e, no Assistente de importação de texto, escolha:
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
fonte
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
fonte
No meu caso, adicionar o preâmbulo ao arquivo resolveu meu problema:
fonte
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
fonte
br
tag), o Excel para Mac ignora os (funciona com Windows) CSSmso-data-placement:same-cell;
Isso funciona para mim
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
fonte
Resolva isso usando java (UTF-16LE com BOM):
Observe que o arquivo CSV deve ser usado
TAB
como 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?
fonte