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).
- Exemplo de dor hexadeecimal de ACH IVO de resultados originais de dados.