Codificando problemas para o arquivo CSV UTF8 quando você abre o Excel e o Textedit

como @jlarson atualizado com as informações que Mac foi maior culpado, poderíamos obter mais informações. Office for Mac tem pelo menos 2011 e depois, um suporte muito ruim para ler formatos Unicode ao importar arquivos.

O suporte UTF-8 parece ser quase inexistente, eu li alguns comentários sobre como funciona , enquanto a maioria diz não. Infelizmente eu não tenho nenhum Mac para tentar. Então, os próprios ficheiros devem ser bem como UTF-8, mas a importação interrompe o processo.

Eu escrevi um teste rápido em JavaScript para exportar a porcentagem de pequenas e grandes escapadas de UTF-16, con – / sem BOM, etc.

O código provavelmente deve ser refatore, mas deve ser bom para o teste. Poderia funcionar melhor que o UTF-8. Claro, isso também geralmente significa transferências de dados maiores, já que qualquer glifo tem dois ou quatro bytes.

Você pode encontrar um violino aqui:

Nicode Export Sample Fiddle

Por favor, note que não lida com o CSV de qualquer forma particular. É destinado principalmente à conversão pura ao URL de dados com UTF-8, UTF-16 Big / Little Endian e + -g. Há uma opção no violino para substituir as vírgulas com guias, mas acho que seria uma solução bastante difícil e frágil se funcionar.

normalmente é usado como:

Existem duas propriedades de resultado do objeto:

1.) encoder.lead

Este é o tipo MIME, conjunto de caracteres, etc. Para o URL de dados. Construído a partir de opções passadas para o inicializador, ou você também pode dizer .config({ ... new conf ...}).intro() para reconstruir.

data:

pode especificar base64 , mas não há conversão base64 (pelo menos não tão longe).

2.) encoder.buf

Esta é uma string com A porcentagem de dados escapados.

A função .pay() simplesmente retorna 1.) e 2.) como um.

principal Código:

function DataEnc(a) { this.config(a); this.intro();}/** http://www.iana.org/assignments/character-sets/character-sets.xhtml* */DataEnc._enctype = { u8 : , // RFC-2781, Big endian should be presumed if none given u16be : , u16le : };DataEnc._BOM = { 'none' : '', 'UTF-8' : '%ef%bb%bf', // Discouraged 'UTF-16BE' : '%fe%ff', 'UTF-16LE' : '%ff%fe'};DataEnc.prototype = { // Basic setup config : function(a) { var opt = { charset: 'u8', mime : 'text/csv', base64 : 0, bom : 0 }; a = a || {}; this.charset = typeof a.charset !== 'undefined' ? a.charset : opt.charset; this.base64 = typeof a.base64 !== 'undefined' ? a.base64 : opt.base64; this.mime = typeof a.mime !== 'undefined' ? a.mime : opt.mime; this.bom = typeof a.bom !== 'undefined' ? a.bom : opt.bom; this.enc = this.utf8; this.buf = ''; this.lead = ''; return this; }, // Create lead based on config // data:,<data> intro : function() { var g = , c = this.charset || '', b = 'none' ; if (this.mime && this.mime !== '') g.Push(this.mime); if (c !== '') { c = c.replace(//g, '').toLowerCase(); if (DataEnc._enctype.u8.indexOf(c) > -1) { c = 'UTF-8'; if (this.bom) b = c; this.enc = this.utf8; } else if (DataEnc._enctype.u16be.indexOf(c) > -1) { c = 'UTF-16BE'; if (this.bom) b = c; this.enc = this.utf16be; } else if (DataEnc._enctype.u16le.indexOf(c) > -1) { c = 'UTF-16LE'; if (this.bom) b = c; this.enc = this.utf16le; } else { if (c === 'copy') c = ''; this.enc = this.copy; } } if (c !== '') g.Push('charset=' + c); if (this.base64) g.Push('base64'); this.lead = 'data:' + g.join(';') + ',' + DataEnc._BOM; return this; }, // Deliver pay : function() { return this.lead + this.buf; }, // UTF-16BE utf16be : function(t) { // U+0500 => %05%00 var i, c, buf = ; for (i = 0; i < t.length; ++i) { if ((c = t.charCodeAt(i)) > 0xff) { buf.Push(('00' + (c >> 0x08).toString(16)).substr(-2)); buf.Push(('00' + (c & 0xff).toString(16)).substr(-2)); } else { buf.Push('00'); buf.Push(('00' + (c & 0xff).toString(16)).substr(-2)); } } this.buf += '%' + buf.join('%'); // Note the hex array is returned, not string with '%' // Might be useful if one want to loop over the data. return buf; }, // UTF-16LE utf16le : function(t) { // U+0500 => %00%05 var i, c, buf = ; for (i = 0; i < t.length; ++i) { if ((c = t.charCodeAt(i)) > 0xff) { buf.Push(('00' + (c & 0xff).toString(16)).substr(-2)); buf.Push(('00' + (c >> 0x08).toString(16)).substr(-2)); } else { buf.Push(('00' + (c & 0xff).toString(16)).substr(-2)); buf.Push('00'); } } this.buf += '%' + buf.join('%'); // Note the hex array is returned, not string with '%' // Might be useful if one want to loop over the data. return buf; }, // UTF-8 utf8 : function(t) { this.buf += encodeURIComponent(t); return this; }, // Direct copy copy : function(t) { this.buf += t; return this; }};

Resposta anterior:

Eu não tenho nenhuma configuração para replicar o seu, mas se o seu caso é o mesmo que esse de @ Jlarson, o arquivo resultante deve estar correto.

Esta resposta foi um pouco longa, (o tema engraçado que você diz?), Mas discute vários aspectos da pergunta, o que está acontecendo (provável) e como realmente o que está acontecendo de várias maneiras.

tl; DR:

É provável que o texto seja importado como ISO-8859-1, Windows-1252 ou similar e não como UTF-8. Forçar o aplicativo para ler o arquivo, como UTF-8, importando ou outros meios.

PS: O UniSearcher é uma boa ferramenta para ter disponível nesta viagem.

A longa estrada em torno

a forma “mais fácil” de ser 100% de certeza do que estamos vendo é usar um editor hexadecimal no resultado. Como alternativa, use , xxd ou similar a partir da linha de comando para ver o arquivo. Nesse caso, a sequência de bytes deve ser a da UTF-8 como entregue a partir do script.

Como um exemplo, se fizermos o script jlarson levar o Array:

data = , 

Isto é mesclado na string:

 name,city,state<newline> \u0500\u05E1\u0E01\u1054,seattle,washington<newline>

Isso traduz por Unicode A:

 name,city,state<newline> Ԁסกၔ,seattle,washington<newline>

Como UTF-8 usa ASCII como base (bytes com o bit mais alto não é o mesmo que no ASCII), o único sequência especial nos dados de teste é “e ס ס” que, por sua vez, é:

Code-point Glyph UTF-8---------------------------- U+0500 Ԁ d4 80 U+05E1 ס d7 a1 U+0E01 ก e0 b8 81 U+1054 ၔ e1 81 94

olhando para o despejo hexadecimal do arquivo baixado:

0000000: 6e61 6d65 2c63 6974 792c 7374 6174 650a name,city,state.0000010: d480 d7a1 e0b8 81e1 8194 2c73 6561 7474 ..........,seatt0000020: 6c65 2c77 6173 6869 6e67 746f 6e0a le,washington.

Na segunda linha, encontramos d480 d7a1 e0b8 81e1 8194 que corresponde ao acima:

0000010: d480 d7a1 e0b8 81 e1 8194 2c73 6561 7474 ..........,seatt | | | | | | | | | | | | | | +-+-+ +-+-+ +--+--+ +--+--+ | | | | | | | | | | | | | | | | Ԁ ס ก ၔ , s e a t t

Nenhum dos outros caracteres é destruído.

faça testes semelhantes, se quiser. O resultado deve ser o semelhante.

por amostra fornecido â € œat â € “â €”

também podemos dar uma olhada na amostra fornecida na pergunta. É provável que o texto seja representado no Excel / TextIt na página de código 1252.

Citar Wikipedia no Windows-1252:

Windows-1252 ou CP-1252 é uma codificação de caractere do alfabeto latino, usada por padrão nos componentes legados do Microsoft Windows em inglês e alguns outros idiomas ocidentais. É uma versão dentro do grupo de páginas de código do Windows. Em pacotes de látex, você é referido como “ansinew”.

Recuperando os bytes originais

para traduzir de volta em seu formulário original, podemos ver o design da página de código, de onde Chegamos:

Character: <â> <€> <”> <,> < > <â> <€> < > <,> < > <â> <€> <œ>U.Hex : e2 20ac 201d 2c 20 e2 20ac 9d 2c 20 e2 20ac 153T.Hex : e2 80 94 2c 20 e2 80 9d* 2c 20 e2 80 9c
  • U é a abreviatura do Unicode
  • T é a abreviação traduzida

por exemplo:

â => Unicode 0xe2 => CP-1252 0xe2” => Unicode 0x201d => CP-1252 0x94€ => Unicode 0x20ac => CP-1252 0x80

capas especiais Como 9d Não tenha um ponto de código correspondente no CP-1252, simplesmente copiá-los diretamente.

Nota: Se você notar a string danificada copiando o texto em Um arquivo e fazer um despejo hexadecimal, salve o arquivo, por exemplo, com codificação UTF-16 para obter valores Unicode como eles são representados na tabela. Por exemplo. Em vim:

set fenc=utf-16# Orset fenc=ucs-2

bytes para utf-8

Então nós combinamos o resultado, o T.Hex, em UTF-8. Nas sequências UTF-8, bytes são representados por um byte principal nos diz quantos bytes subseqüentes formam o glifo. Por exemplo, se um byte tiver o valor binário 110x xxxx, sabemos que este byte e o seguinte representam um ponto de código. Um total de dois. 1110 xxxx Diga-nos que são três e assim por diante. Os valores ASCII não têm o bit de alta estabelecimento, então qualquer byte que corresponda 0xxx xxxx é independente. Um total de um byte.

0xe2 = 1110 0010compartimiento => 3 bytes => 0xe28094 (em-dash) - 0x2c = 0010 1100compartimiento => 1 byte => 0x2c (coma), 0x2c = 0010 0000compartimiento => 1 byte => 0x20 (espacio) 0xe2 = 1110 0010compartimiento => 3 bytes => 0xe2809d (d-derecha) ” 0x2c = 0010 1100compartimiento => 1 byte => 0x2c (coma), 0x2c = 0010 0000compartimiento => 1 byte => 0x20 (espacio) 0xe2 = 1110 0010compartimiento => 3 bytes => 0xe2809c (izquierda-dq) "

Conclusão; A string UTF-8 original foi:

—, ”, "

Retorná-lo

Nós também podemos fazer o contrário. A cadeia original como bytes:

UTF-8: e2 80 94 2c 20 e2 80 9d 2c 20 e2 80 9c

correspondentes valores no CP-1252:

e2 => â80 => €94 => ”2c => ,20 => <space>...

e assim por diante, resultado:

—, â€, “

Importando MS Excel

Em outras palavras: o problema em questão poderia ser como Importar arquivos de texto UTF-8 no MS Excel e alguns outros aplicativos. No Excel, isso pode ser feito de várias maneiras.

  • Método um:

Não salve o arquivo com uma extensão reconhecida pelo aplicativo, como .csv ou .txt, mas omite completamente ou inventar algo.

Como um exemplo, salve o arquivo como "testfile", sem extensão. Em seguida, no Excel, abra o arquivo, confirme que realmente queremos abrir este arquivo e voilà nós recebemos a opção de codificação. Selecione UTF-8, e o arquivo deve ser lido corretamente.

  • Método dois:

Use dados de importação em vez de abrir o arquivo. Algo como:

Data -> Import External Data -> Import Data

Selecione a codificação e prossiga.

Verifique se o Excel e a fonte selecionada realmente suportam glifo

Também podemos testar a compatibilidade de fontes para caracteres Unicode usando a área de transferência, às vezes mais amigável. Por exemplo, copie o texto desta página no Excel:

  • página com pontos de código U + 0E00 A U + 0EFF

Se houver suporte para pontos de código , o texto deve ser exibido corretamente.

Linux

no Linux, que é principalmente UTF-8 na área do usuário, isso não deve ser um problema. Usando o Grátis Office Calc, Vim, etc., mostre os arquivos renderizados corretamente.

Por que funciona (ou deve)

Encodeuri dos estados de especificação, (leia também SEC-15.1. )

A função Encodeuri calcula uma nova versão de uma URI na qual cada instância de certos caracteres é substituída por uma, duas ou quatro seqüências de escape. Representando a codificação UTF-8 de caractere.

Podemos simplesmente provar isso em nosso console, por exemplo, dizendo:

Quando registramos, as sequências de escape são iguais às do despejo hexadecimal anterior:

%D4%80%D7%A1%E0%B8%81%E1%81%94 (encodeURI in log) d4 80 d7 a1 e0 b8 81 e1 81 94 (hex-dump of file)

O, teste um código de 4 bytes:

>> encodeURI('????')<< "%F3%B1%80%81"

se isso não estiver em conformidade

Se nada disso se aplica puder ajudar se você adicionar

    amostra de entrada esperada vs saída danificada, (Copy paste).
  1. Exemplo de dor hexadeecimal de ACH IVO de resultados originais de dados.

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *