c# utf8 Obtenir des données CSV à partir du Presse-papiers(collé à partir d'Excel) contenant des caractères accentués




powershell encoding utf8 (2)

SCÉNARIO

  • Mes utilisateurs vont copier des cellules à partir d'Excel (le plaçant ainsi dans le presse-papiers)
  • Et mon application récupérera ces cellules du presse-papiers

LE PROBLÈME

  • Mon code récupère le format CSV depuis le presse papier
  • Cependant, si le contenu Excel original contient des caractères tels que ä (un avec tréma) puis la chaîne CSV récupérée n'a pas les caractères corrects (ä finit par apparaître comme un "carré" pour moi)
  • En comparaison, si mon code récupère le format de texte Unicode dans le presse-papier, tout fonctionne bien: le ä est conservé dans la chaîne extraite du presse-papiers.

CODE SOURCE - ORIGINAL - AVEC LE PROBLÈME

[STAThread]
static void Main(string[] args)
{
    var fmt_csv = System.Windows.Forms.DataFormats.CommaSeparatedValue;

    // read the CSV
    var dataobject = System.Windows.Forms.Clipboard.GetDataObject();
    var stream = (System.IO.Stream)dataobject.GetData(fmt_csv);
    var enc = new System.Text.UTF8Encoding();
    var reader = new System.IO.StreamReader(stream,enc);
    string data_csv = reader.ReadToEnd();

    // read the unicode string
    string data_string = System.Windows.Forms.Clipboard.GetText();



}

LES RÉSULTATS LORS DE L'EXÉCUTION DU CODE D'ÉCHANTILLON

  • Les étapes de repro: Entrez du texte dans Excel (j'ai utilisé le mot "doppelgänger" plus quelques chiffres) et appuyez simplement sur Ctrl-C pour le copier dans le presse-papier, puis exécutez le code ci-dessus.
  • data_csv est défini sur "doppelg nger, 1 \ r \ n2,3 \ r \ n \ 0"
  • data_string est défini sur "doppelgänger \ t1 \ r \ n2 \ t3 \ r \ n"

QUESTION

  • Que puis-je faire pour obtenir les bons caractères?

COMMENTAIRES

  • Oui, je sais que je pourrais contourner ce problème en utilisant le texte Unicode. Mais je veux vraiment comprendre ce qui se passe avec le CSV
  • l'utilisation ou non du codage UTF-8 lors de la récupération du flux ne fait aucune différence dans les résultats

LA RÉPONSE

Après avoir examiné les commentaires et accordé une attention particulière à ce que Excel mettait dans le presse-papiers pour CSV, il semblait raisonnable que Excel place le contenu en utilisant un encodage "hérité" au lieu de UTF-8. J'ai donc essayé d'utiliser la page de codes de Windows 1252 comme encodage et cela fonctionnait. Voir le code ci-dessous

CODE SOURCE - AVEC LA RÉPONSE

[STAThread]
static void Main(string[] args)
{
    var fmt_csv = System.Windows.Forms.DataFormats.CommaSeparatedValue;

    //read the CSV
    var dataobject = System.Windows.Forms.Clipboard.GetDataObject();
    var stream = (System.IO.Stream)dataobject.GetData(fmt_csv);
    var enc = System.Text.Encoding.GetEncoding(1252);
    var reader = new System.IO.StreamReader(stream,enc);
    string data_csv= reader.ReadToEnd();

    //read the Unicode String
    string data_string = System.Windows.Forms.Clipboard.GetText();
}

Excel stocke la chaîne dans le Presse-papiers à l'aide du codage de caractères Unicode. La raison pour laquelle vous obtenez un carré lorsque vous essayez de lire la chaîne dans ANSI est qu'il n'y a aucune représentation de ce caractère dans la page de code ANSI de votre système. Vous devez simplement utiliser Unicode. Si vous rencontrez des problèmes de localisation, alors ANSI est juste un problème.

Edit: Joel Spolsky a écrit une excellente introduction aux encodages de caractères, qui vaut vraiment la peine d'être vérifiée: le minimum absolu que tout développeur de logiciel doit absolument connaître sur les jeux de caractères et d'Unicode (pas d'excuses!)


Votre encodage du flux en UTF8 ne fonctionne pas. Les octets du tréma sont convertis en caractère unicode "caractère de remplacement".

Au lieu de cela, il suffit de regarder les données du flux sans aucune instruction d'encodage supplémentaire. Les données seront dans un format défini utilisé par Excel. Vous devriez être capable de dire en regardant le ou les octets où se trouve le non-autorisé. Vous devriez alors pouvoir le convertir en UTF-8.

Le pire des cas est que le CSV Formatter jette tout ce qui n'est pas Ascii. Dans ce cas, vous pourrez peut-être écrire votre propre formateur de données.

Dans certains cas, les gens d’Excel ont compris que le format CSV signifie Ascii uniquement. Voir http://www.tech-archive.net/Archive/Excel/microsoft.public.excel.misc/2008-07/msg02270.html







diacritics