2009-09-16 9 views
51

J'écris une politique TFS Checkin, qui vérifie si nos fichiers source contiennent l'en-tête de notre fichier.Comment lire un fichier codé ANSI contenant des caractères spéciaux

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 codés en ANSI. Donc, si je lis ces fichiers dans la politique, la chaîne ressemble à ceci "Copyright 2009". Je me suis fatigué de changer le codage de la chaîne, mais cela n'aide pas. Alors, comment puis-je lire ces fichiers, que j'obtiens la bonne chaîne "Copyright © 2009"?

Merci pour votre aide!

Cordialement Eny

+0

utilisez-vous toujours des en-têtes de fichiers? Ils semblent de peu de valeur ... –

+0

@Mitch: Que recommanderiez-vous au lieu de transporter des informations de copyright dans le code source? – AnthonyWJones

+2

Ce n'est pas à nous de décider, c'est la politique de l'entreprise. – Enyra

Répondre

101

Utilisation Encoding.Default:

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

Vous devez être conscient, cependant, que ce lit à l'aide de l'encodage par défaut du système - qui ne peut être le même que l'encodage du fichier. Il n'y a pas d'encodage unique appelé ANSI, mais habituellement quand les gens parlent de "l'encodage ANSI" ils veulent dire Windows Code Page 1252 ou quel que soit leur boîtier.

Votre code sera plus robuste si vous pouvez trouver le exact codage utilisé.

+0

Je trouve le type d'encodage avec le préambule des encodages, ensuite ça marche bien, merci. – Enyra

5

Il semblerait raisonnable si vous allez avoir de telles politiques que vous auriez également l'encodage 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) - Codepage 65001" (sauf peut-être pour les pages ASPX avec un contenu statique non latin significatif mais même alors je peux ' Je ne vois pas en quoi il serait important d'utiliser UTF-8).

En supposant que vous souhaitiez toujours autoriser les codages mixtes, vous devez ensuite déterminer le codage dans lequel un fichier a été enregistré afin de connaître le codage à transmettre à ReadAllText. Ce n'est pas facile à déterminer à partir du fichier, mais en utilisant Encoding.Default est susceptible de fonctionner correctement. Comme il est très probable que vous ayez seulement 2 encodages à gérer, le VS (UTF-8 avec signature) et un codage ANSI commun utilisé par vos machines (probablement Windows-1252).

Et donc,

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

fonctionnera. (Comme je vois que 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é de toute façon. Ainsi, lorsque le fichier est sauvegardé en utilisant UTF-8, vous obtenez des résultats corrects et lorsque vous utilisez ANSI, vous obtiendrez probablement des résultats corrects.

BTW si vous êtes en train de traiter les en-têtes de fichiers ne serait pas ReadAllLines faciliter les choses?

+0

Je me demande également pourquoi nous avons des fichiers codés ANSI ^^ – Enyra

+0

Votre solution de simplement utiliser l'encodage.La valeur par défaut échouerait si l'entrée était un fichier UTF8, mais n'avait pas de nomenclature (tous les fichiers UTF ne sont pas fournis avec les nomenclatures bien sûr). –

+1

Merci de préciser que même si vous utilisez "Encoding.Default" si une nomenclature est trouvée au début du fichier, elle retournera à UTF8. Cela a sauvé ma journée. – carlos357