SCÉNARIO
- Mes utilisateurs copieront des cellules d'Excel (en les plaçant dans le presse-papiers).
- Et mon application récupérera ces cellules dans le presse-papiers.
LE PROBLÈME
- Mon code récupère le format CSV à partir du presse-papiers.
- Cependant, si le contenu original d'Excel contient des caractères comme ä (a avec tréma), 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 à partir du presse-papiers, tout fonctionne bien : le ä est préservé dans la chaîne récupérée dans le 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 DE L'EXÉCUTION DE L'ÉCHANTILLON DE CODE
- Repro étapes : Entrez du texte dans Excel (j'ai utilisé le mot "doppelgänger" et quelques chiffres) et appuyez simplement sur Ctrl-C pour le copier dans le presse-papiers, puis exécutez le code ci-dessus.
- data_csv est réglé sur "doppelgnger,1". \r\n2 ,3 \r\n\0 "
- data_string a pour valeur "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 en fait comprendre ce qui se passe avec le CSV.
- L'utilisation ou non de l'encodage 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 prêté une attention particulière à ce qu'Excel mettait dans le presse-papiers pour le CSV, il semblait raisonnable qu'Excel place le contenu en utilisant un encodage "ancien" au lieu d'UTF-8. J'ai donc essayé d'utiliser le codepage Windows 1252 comme encodage et cela a fonctionné. 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();
}