Probleme de codificare pentru fișierul UTF8 CSV atunci când deschideți Excel și Textedit

ca @jlarson actualizat cu informațiile pe care Mac a fost mai mare vinovat, am putea obține mai multe informații. Office pentru Mac are cel puțin 2011 și mai târziu, un suport foarte slab pentru a citi formatele Unicode atunci când importați fișiere.

Suportul UTF-8 pare să fie aproape inexistent, am citit câteva comentarii despre cum funcționează , în timp ce cel mai mult spune nu. Din păcate, nu am nici un Mac pentru a încerca. Așa din nou: fișierele în sine ar trebui să fie bine ca UTF-8, dar importul oprește procesul.

Am scris un test rapid în JavaScript pentru a exporta procentajul de UTF-16 mici și mari Escaped Escapes, con – / Fără BOM, etc.

Codul ar trebui să fie probabil rebactorizat, dar ar trebui să fie bine pentru testare. Ar putea funcționa mai bine decât UTF-8. Desigur, acest lucru înseamnă, de asemenea, transferuri de date mai mari, deoarece orice glifo are doi sau patru octeți.

Puteți găsi o vioară aici:

Nicode Export Export Finkdle

Vă rugăm să rețineți că nu se ocupă de CSV în nici un fel. Acesta este destinat în principal conversiei pure la adresa URL de date cu UTF-8, UTF-16 Big / Little Endian și +/- BOM. Există o opțiune în vioage pentru a înlocui virgulele cu file, dar cred că ar fi o soluție destul de dificilă și fragilă dacă funcționează.

În mod normal, este folosit ca:

// Initiateencoder = new DataEnc({ mime : 'text/csv', charset: 'UTF-16BE', bom : true});// Convert data to percent escaped textencoder.enc(data);// Get resultvar result = encoder.pay();

Există două proprietăți de rezultat ale obiectului:

1.) encoder.lead

Acesta este tipul MIME, setul de caractere etc. Pentru adresa URL de date. Construit din opțiuni transmise la inițializator sau puteți spune, de asemenea, .config({ ... new conf ...}).intro() pentru a reconstrui.

iv id = „525c1bab98”

poate specifica base64 , dar nu există nici o conversie de bază64 (cel puțin nu atât de departe).

2.) encoder.buf

Acesta este un șir cu Procentul de date scăpate.

Funcția .pay() pur și simplu returnează 1.) și 2.) ca unul.

Main Cod:

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

Răspuns anterior:

Nu am nici o configurație pentru a replica a ta, dar dacă cazul tău este același ca asta de @ Jlarson, fișierul rezultat ar trebui să fie corect.

Acest răspuns a fost oarecum lung, (tema amuzantă pe care o spui?), dar discută mai multe aspecte ale întrebării, ceea ce se întâmplă (probabil) și cum verificați Într-adevăr ceea ce se întâmplă în mai multe moduri.

TL; DR:

Este posibil ca textul să fie importat ca ISO-8859-1, Windows-1252 sau similar și nu ca UTF-8. Forțează aplicația să citească fișierul cum ar fi UTF-8 prin import sau alte mijloace.

PS: UnisariCher este un instrument bun care să aibă la dispoziție în această călătorie.

Drumul lung din jurul

„cea mai ușoară” formă de a fi 100% sigur de ceea ce vedem este de a folosi un editor hexazecimal în rezultat. Alternativ, utilizați , xxd sau similar de la linia de comandă pentru a vedea fișierul. În acest caz, secvența octetului ar trebui să fie cea a UTF-8 așa cum este livrată din scenariu.

ca un exemplu, dacă luăm scriptul Jlarson luați data Array:

data = , 

Aceasta este fuzionată în șir:

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

care se traduce de Unicode A:

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

AS UTF-8 utilizează ASCII ca bază (octeți cu cel mai mare nu a fost stabilit sunt aceleași ca în ASCII), singurul Secvența specială în datele de testare este „și ס ၔ” care la rândul său, este:

iv id = „95fac44b97”

Privind la hexadecimal Dump al fișierului Descărcat:

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.

pe a doua linie găsim d480 d7a1 e0b8 81e1 8194 care se potrivește cu cele de mai sus:

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

Nici unul dintre celelalte caractere nu este distrus.

Faceți teste similare dacă doriți. Rezultatul trebuie să fie cel similar.

pe eșantion furnizat „,” â € œ

Putem să aruncăm o privire la eșantionul furnizat în întrebare. Este posibil să presupunem că textul este reprezentat în Excel / Textedit pe pagina de cod 1252.

pentru a citei Wikipedia în Windows-1252:

Windows-1252 sau CP-1252 este o codificare de caractere al alfabetului latin, utilizat în mod implicit în componentele moștenite ale Microsoft Windows în limba engleză și în alte limbi occidentale. Este o versiune în cadrul grupului de pagini de cod Windows. În pachetele de latex, sunteți denumit „ansinew”.

recuperarea octeților originali

pentru ao traduce înapoi în forma sa originală, putem vedea designul paginii de cod, de unde Noi obținem:

div id = „ECEB700485”>

  • iv id = „A31995071e” este abrevierea Unicode
  • T este abrevierea tradusă

De exemplu:

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

Cazuri Speciale ca Nu aveți un punct de cod corespunzător pe CP-1252, pur și simplu le copiem direct.

Notă: Dacă observați șirul deteriorat Copierea textului în Un fișier și făcând o dumpă hexazecimală, salvați fișierul, de exemplu, cu codarea UTF-16 pentru a obține valori Unicode așa cum sunt reprezentate în tabel. De exemplu. În Vim:

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

Bytes la UTF-8

Apoi combină rezultatul, T.Hex, în UTF-8. În secvențele UTF-8, octeții sunt reprezentați de un octet principal ne spune câți octeți ulteriori formează Glyph. De exemplu, dacă un octet are valoarea binară 110x xxxx Spuneți-ne că sunt trei și așa mai departe. Valorile ASCII nu au bitul înalt, astfel încât orice octet care se potrivește 0xxx xxxx este independent. Un total de octet.

Concluzie; Șirul original UTF-8 a fost:

—, ”, "

returnează-l

Putem face și altfel. Lanțul original ca octeți:

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

valori corespunzătoare în CP-1252:

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

și așa mai departe, rezultatul:

iv id = „22ddd8e1a3”

Importarea MS Excel

Cu alte cuvinte: problema în cauză ar putea fi cum să Importați fișiere de text UTF-8 în MS Excel și alte aplicații. În Excel, acest lucru se poate face în mai multe moduri.

Nu salvați fișierul cu o extensie recunoscută de aplicație, ca .csv sau .txt, dar omiteți-l complet sau inventați ceva.

ca un exemplu, salvați fișierul ca "testfile", fără extensie. Apoi, în Excel, deschideți fișierul, confirmați că dorim cu adevărat să deschidem acest fișier și voilà primim opțiunea de codificare. Selectați UTF-8, iar fișierul trebuie citit corect.

  • Două:

Utilizați datele de import în loc să deschideți fișierul. Ceva de genul:

Data -> Import External Data -> Import Data

Selectați codarea și continuarea.

Verificați dacă Excel și sursa selectată de fapt suportă gnifo

De asemenea, putem testa compatibilitatea surselor pentru caracterele Unicode folosind Clipboard, uneori, mai prietenos. De exemplu, copiați textul acestei pagini în Excel:

  • Pagina cu puncte de cod U + 0E00 A U + 0EFF

Dacă există suport pentru punctele de cod , textul trebuie afișat corect.

Linux

în Linux, care este în principal UTF-8 în zona de utilizator, aceasta nu ar trebui să fie o problemă. Utilizarea Free Office Calc, Vim, etc, afișați fișierele redate corect.

De ce funcționează (sau ar trebui)

codificare a statelor de specificații (citiți, de asemenea, SEC-15.1. ):

Funcția encodeuri calculează o nouă versiune a unui URI în care fiecare instanță a anumitor caractere este înlocuită cu una, două, trei sau patru secvențe de evacuare Reprezentarea codului UTF-8 a caracterului.

Putem dovedi acest lucru în consola noastră, de exemplu spunând:

>> encodeURI('Ԁסกၔ,seattle,washington')<< "%D4%80%D7%A1%E0%B8%81%E1%81%94,seattle,washington"

Când ne înregistram, secvențele de evacuare sunt egale cu cele ale dumpului hexazecimal anterior:

divid id = „1A08E7FD9F”>

O, testarea Un cod de 4 octeți:

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

Dacă acest lucru nu este conform

dacă niciunul dintre acestea nu se poate ajuta dacă adăugați

  1. Eșantion de intrare așteptat față de ieșirea deteriorată (paste de copiere).
  2. Exemplu de durere hexadeecimală a ACH IVO a rezultatelor datelor originale.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *