web-dev-qa-db-fra.com

Comment lire un fichier encodé ANSI contenant des caractères spéciaux

J'écris une politique d'enregistrement TFS, qui vérifie si nos fichiers source contenant notre en-tête de fichier.

Mon problème est que notre en-tête de fichier contient un caractère spécial "©" et malheureusement certains de nos fichiers source sont encodés en ANSI. Donc, si je lis ces fichiers dans la politique, la chaîne ressemble à ceci "Copyright � 2009".

string content = File.ReadAllText(pendingChange.LocalItem);

Je suis fatigué de changer l'encodage de la chaîne, mais cela n'aide pas. Alors, comment puis-je lire ces fichiers, que j'obtiens la chaîne correcte "Copyright © 2009"?

Merci pour l'aide!

Cordialement Eny

57
Enyra

Utilisation Encoding.Default:

string content = File.ReadAllText(pendingChange.LocalItem, Encoding.Default);

Cependant, vous devez savoir que cela le lit en utilisant l'encodage par défaut du système - qui peut ne pas être le même que l'encodage du fichier. Il n'y a pas d'encodage unique appelé ANSI, mais généralement lorsque les gens parlent de "l'encodage ANSI", ils désignent la page de codes Windows 125 ou tout ce que leur boîte utilise.

Votre code sera plus robuste si vous pouvez découvrir l'encodage exact utilisé.

120
Jon Skeet

Il semblerait raisonnable que vous ayez de telles politiques que vous auriez également un codage standard convenu par l'équipe. Pour être honnête, je ne vois pas pourquoi une équipe utiliserait un encodage autre que "Unicode (UtF-8 avec signature) - Page de code 65001" (sauf peut-être pour les pages ASPX avec un contenu statique non latin important mais même alors je peux ' t voir comment ce serait une grosse affaire d'utiliser UTF-8).

En supposant que vous souhaitiez toujours autoriser les encodages mixtes, vous devez ensuite trouver un moyen de déterminer l'encodage dans lequel un fichier a été enregistré afin de savoir quel encodage passer à ReadAllText. Ce n'est pas facile à déterminer à partir du fichier, mais en utilisant Encoding.Default est susceptible de fonctionner correctement. Comme il est fort probable que vous n'ayez à gérer que 2 encodages, le VS (UTF-8 avec signature) et un encodage ANSI commun utilisé par vos machines (probablement Windows-1252).

Par conséquent, en utilisant

 string content = File.ReadAllText(pendingChange.LocalItem, Encoding.Default);

marchera. (Comme je vois Jon a déjà posté). Cela fonctionne parce que lorsque la nomenclature UTF-8 (qui est ce que VS signifie par le terme "signature") est présente au début du fichier, le paramètre de codage fourni est ignoré et UTF-8 est utilisé quand même. Par conséquent, lorsque le fichier est enregistré en utilisant UTF-8, vous obtenez des résultats corrects et lorsque ANSI est utilisé, vous êtes également susceptible d'obtenir des résultats corrects.

BTW si vous traitez des en-têtes de fichiers, ReadAllLines ne faciliterait-il pas les choses ?.

5
AnthonyWJones