J'ai remarqué un comportement étrange de File.Copy()
dans .NET 3.5SP1. Je ne sais pas si c'est un bug ou une fonctionnalité. Mais je sais que ça me rend fou. Nous utilisons File.Copy()
dans une étape de construction personnalisée, et il vissera l'encodage de caractères. Lorsque je copie un fichier texte d'encodage ASCII sur un fichier texte codé en UTF-8, le fichier de destination est toujours codé en UTF-8, mais contient le contenu du nouveau fichier plus les 3 caractères préfixés pour UTF-8. C'est bien pour les caractères ASCII, mais incorrect pour les caractères restants (128-255) de la page de code ANSI.File.Copy et le codage de caractères
Voici le code à reproduire. Je copie d'abord un fichier UTF-8 vers la destination, puis je copie un fichier ANSI vers la même destination. Notez la sortie de la deuxième sortie de la console: Content of copy.txt : this is ASCII encoded:/Encoding: utf-8
File.WriteAllText("ANSI.txt", "this is ANSI encoded: é", Encoding.GetEncoding(0));
File.WriteAllText("UTF8.txt", "this is UTF8 encoded: é", Encoding.UTF8);
File.Copy("UTF8.txt", "copy.txt", true);
using (StreamReader reader = new StreamReader("copy.txt", true))
{
Console.WriteLine("Content of copy.txt : " + reader.ReadToEnd() + "/Encoding: " +
reader.CurrentEncoding.BodyName);
}
File.Copy("ANSI.txt", "copy.txt", true);
using (StreamReader reader = new StreamReader("copy.txt", true))
{
Console.WriteLine("Content of copy.txt : " + reader.ReadToEnd() + "/Encoding: " +
reader.CurrentEncoding.BodyName);
}
Toutes les idées pourquoi cela se produit? Y a-t-il une erreur dans mon code? Toutes les idées comment résoudre ce problème (mon idée actuelle est de supprimer le fichier avant si elle existe)
EDIT: correcte confusion ANSI/ASCII
Le problème n'est pas StreamReader. Je l'ai seulement utilisé pour créer un court morceau de code qui peut reproduire le problème. (et j'ai foiré depuis que j'ai confondu ASCII et ANSI en jouant avec ça). Je l'ai remarqué d'abord dans un éditeur hexadécimal, et à ma connaissance le fichier résultant est incorrect, car il a la marque d'ordre octet UTF-8 (3 octets au début) et un mauvais code caractère pour le caractère accentué – chris166
Quelque chose est bizarre. Je ne suis plus capable de le reproduire. Donc, quelque chose était obsolète (mon éditeur hexadécimal, le code dans VS ou autre). Quoi qu'il en soit, merci d'avoir examiné le problème et de passer autant de temps dessus! – chris166
Mon plaisir - même si cela n'a pas pris beaucoup plus de temps qu'il n'en fallait pour taper la réponse. D'autres questions ont parfois absorbé * beaucoup * plus d'efforts :) –