pour le fichier CSV UTF8 lorsque vous ouvrez Excel et TextEdit

comme @Jlarson mis à jour avec les informations que Mac était la plus grande coupable, nous pourrions avoir plus d’informations. Bureau pour Mac a au moins 2011 et plus tard, un support très médiocre pour lire les formats UNICODE lors de l’importation de fichiers.

Le support UTF-8 semble être presque inexistant, j’ai lu quelques commentaires sur la façon dont cela fonctionne , tandis que la plupart disent non. Malheureusement, je n’ai pas de Mac à essayer. Encore une fois: les fichiers eux-mêmes devraient être corrects comme UTF-8, mais l’importation arrête le processus.

J’ai écrit un test rapide dans JavaScript pour exporter le pourcentage de petites et grandes évasions de l’UTF-16 échappées, con – / SANS BOM, etc.

Le code devrait probablement être refactorisé, mais cela devrait être correct pour le test. Cela pourrait fonctionner mieux que UTF-8. Bien entendu, cela signifie généralement des transferts de données plus importants, car tout GLIFO a deux ou quatre octets.

Vous pouvez trouver un violon ici:

Nicode Export Sample Fiddle

Veuillez noter que cela ne gère pas CSV de manière particulière. Il est principalement destiné à une conversion pure à l’URL de données avec UTF-8, UTF-16 Big / Petit Endian et +/- BOM. Il y a une option dans le violon pour remplacer les virgules par des onglets, mais je pense que ce serait une solution assez difficile et fragile si elle fonctionne.

Normalement, il est utilisé comme:

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

Il existe deux propriétés de résultat de l’objet:

1.) encoder.lead

Ceci est le type MIME, l’ensemble de caractères, etc. Pour l’URL de données. Construit à partir d’options passées à l’initialiszer ou vous pouvez également dire.config({ ... new conf ...}).intro()pour reconstruire.

data:

peut spécifier base64 , mais il n’y a pas de conversion de base64 (au moins pas si loin).

2.) encoder.buf

Ceci est une chaîne avec Le pourcentage de données échappées.

la fonction .pay() retourne simplement 1.) et 2.) comme un.

Main code:

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éponse précédente:

Je n’ai aucune configuration pour reproduire le vôtre, mais si votre cas est identique à celui de @ jlarson, le fichier résultant devrait être correct.

Cette réponse était quelque peu longue (le thème drôle que vous dites?), mais discute de plusieurs aspects de la question, ce qui se passe (probable) et comment vérifier vraiment ce qui se passe de plusieurs manières.

TL; DR:

Il est probable que le texte est importé en tant que ISO-8859-1, Windows-1252 ou similaire, et non comme UTF-8. Forcez l’application pour lire le fichier tel que UTF-8 en importation ou d’autres moyens.

PS: Le Unisisearker est un bon outil de disposer de ce voyage.

La longue route autour de

La forme « plus facile » d’être sûr de 100% de ce que nous voyons est d’utiliser un éditeur hexadécimal dans le résultat. Alternativement, utilisez , xxd ou similaire de la ligne de commande pour voir le fichier. Dans ce cas, la séquence d’octets doit être celle de UTF-8 comme étant livrée du script.

Par exemple, si nous prenons le script Jlarson, prenez l’ID data tableau:

data = , 

Ceci est fusionné dans la chaîne:

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

qui traduit par Unicode A:

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

As UTF-8 utilise ASCII comme une base (octets avec le bit le plus élevé non établi sont les mêmes que dans ASCII), le seul Séquence spéciale dans les données de test est « ס ס » « qui, à son tour, est la suivante:

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

Regarder le vidage hexadécimal du fichier téléchargé:

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.

sur la deuxième ligne, nous trouvons d480 d7a1 e0b8 81e1 8194 qui correspond à ce qui correspond:

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

Aucun des autres caractères n’est détruit non plus.

faire des tests similaires si vous voulez. Le résultat devrait être le similaire.

par échantillon fourni «AT, «

Nous pouvons également examiner l’échantillon fourni dans la question. Il est susceptible de supposer que le texte est représenté dans Excel / TextEdit sur la page de code 1252.

pour citer Wikipedia dans Windows-1252:

Windows-1252 ou CP-1252 est un codage de caractères de l’alphabet latin, utilisé par défaut dans les composants hérités de Microsoft Windows en anglais et d’autres langues occidentales. C’est une version dans le groupe de pages de code Windows. Dans les emballages en latex, vous êtes appelé «Ansinew».

Récupération des octets d’origine

Pour le traduire dans sa forme d’origine, nous pouvons voir la conception de la page de code, d’où Nous obtenons:

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 est l’abréviation de Unicode
  • T est l’abréviation traduite

par exemple:

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

Cas spéciaux Comme 9d ne pas avoir de point de code correspondant sur CP-1252, nous les copions simplement directement.

Remarque: Si vous remarquez la chaîne endommagée, copie du texte Fichier et faire une vidange hexadécimale, enregistrer le fichier, par exemple, avec l’encodage UTF-16 pour obtenir des valeurs unicode telles qu’elles sont représentées dans le tableau. Par exemple. Dans Vim:

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

octets vers utf-8

alors nous combinons le résultat, le T.Hex, dans utf-8. Dans les séquences UTF-8, les octets sont représentés par un octet principal nous indique combien d’octets ultérieurs forment le glyphe. Par exemple, si un octet a la valeur binaire 110x xxxx, nous savons que cet octet et ce qui suit représente un point de code. Un total de deux. 1110 xxxx Dites-nous que c’est trois et ainsi de suite. Les valeurs ASCII ne possèdent pas le bit très établi, donc aucun octet qui correspond 0xxx xxxx est indépendant. Un total d’un octet.

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) "

conclusion; La chaîne UTF-8 d’origine était:

—, ”, "

le renvoyer

Nous pouvons également faire autrement. La chaîne d’origine comme octets:

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

valeurs correspondantes dans cp-1252:

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

et ainsi de suite, résultat:

—, â€, “

Importation de MS Excel

En d’autres termes: le problème en question pourrait être de savoir comment Importer des fichiers de texte UTF-8 dans MS Excel et d’autres applications. Dans Excel, cela peut être fait de plusieurs manières.

  • Méthode 1:

Ne pas enregistrer le fichier avec une extension reconnue par l’application, comme .csv ou .txt, mais omettez-le complètement ou inventez quelque chose.

Par exemple, enregistrez le fichier comme "testfile", sans extension. Ensuite, dans Excel, ouvrez le fichier, confirmez que nous souhaitons vraiment ouvrir ce fichier et voilà que nous recevons l’option de codage. Sélectionnez UTF-8 et le fichier doit être lu correctement.

  • Méthode Two:

Utilisez les données d’importation au lieu d’ouvrir le fichier. Quelque chose comme:

Data -> Import External Data -> Import Data

Sélectionnez le codage et continuez.

Vérifiez que Excel et la source sélectionnée prennent en charge Glifo

Nous pouvons également tester la compatibilité des sources de caractères Unicode à l’aide du presse-papiers, parfois plus sympathique. Par exemple, copiez le texte de cette page dans Excel:

  • page avec des points de code U + 0E00 A U + 0EFF

S’il y a prise en charge des points de code , le texte doit être correctement affiché.

Linux

sous Linux, qui est principalement UTF-8 dans la zone utilisateur, cela ne devrait pas être un problème. Utilisation de Office gratuit Calc, Vim, etc., affiche les fichiers correctement rendus.

pourquoi cela fonctionne (ou doit)

Encodeuri des états de spécification (Lire également SEC-15.1. ):

La fonction Encodurationi calcule une nouvelle version d’une URI dans laquelle chaque instance de certains caractères est remplacée par une, deux, trois ou quatre séquences d’échappement Représentant le codage UTF-8 de caractère.

Nous pouvons simplement le prouver dans notre console, par exemple en disant:

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

Lorsque nous nous enregistrons, les séquences d’échappement sont égales à celles de la députée hexadécimale précédente:

%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, Test un code de 4 octets:

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

si cela n’est pas conforme

si rien de tout cela ne peut aider si vous ajoutez

  1. échantillon d’entrée attendu VS Sortie endommagée (Copy Coller).
  2. Exemple de douleur hexadeécimale de ACH Ivo des résultats de données d’origine.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *