10
votes

Encoding.default n'est pas identique à aucun codage dans File.ReadallText?

(désolé s'il s'agit d'une dupe)

Je viens de passer beaucoup de temps à essayer de lire correctement un fichier texte.

avoir commencé avec fichier.readalltext (chemin) et obtenir des caractères vissés, j'ai essayé plusieurs variantes de fichier.readalltext (chemin, codage) après lequel j'ai eu Enlisé Down essayant d'analyser mes fichiers d'entrée pour déterminer quel octet était le problème, etc.

En désespoir que j'ai essayé fichier.readalltext (chemin, encoding.default) , qui a fonctionné!

Je suis en train de me battre pour comprendre pourquoi la valeur par défaut est apparemment uniquement la valeur par défaut si vous le spécifiez.

(ma chaîne de test de coupe était + 4433Ç , je l'ai enregistrée dans le Bloc-notes en tant qu'ANSI - bien que les paramètres régionaux français suisses ...)


1 commentaires

Notez que encoding.default ne doit pas être considéré comme le codage "par défaut" - c'est le codage (non unicode!) Pour le codépage par défaut du système par défaut .


3 Réponses :


10
votes

encoding.default est le code ANSI du système.

Quel fichier.readallText fait si vous ne spécifiez pas de codage, c'est ceci:

  • Il vérifie d'abord s'il existe une marque d'ordre d'octets (UTF-8, UTF-16 ou UTF-32). S'il y en a, il utilise le codage spécifié dans la barre d'ordre d'octets.
  • Sinon, il utilise UTF-8.

    Donc, le seul moyen d'obtenir le code ANSI du système est de spécifier explicitement encoding.default.


2 commentaires

File.ReadallText ne vérifie pas la note de commande octet. Il utilisera toujours UTF-8, si vous ne spécifiez pas le codage. Ceci est confirmé par le réflecteur et la source de référence .NET.


Jivko, je ne pense pas que votre commentaire soit correct. ReadallText Sans un codage d'appels ReadallText (chemin, encoding.utf8), mais le flux interne utilisé par ReadallText lira la naissance si elle est présente et remplacez le codage.utf8 avec le codage détecté. En effet, le déteccodingfromByteordermarks est défini sur True dans le constructeur de StreamReader.



2
votes

de MSDN, sur la surcharge String ReadallText (Chemin de chaîne):

Cette méthode tente de détecter automatiquement le codage d'un fichier

Donc non, ce n'est pas la même chose que d'utiliser le codage par défaut


0 commentaires

3
votes

utf8 est la valeur réelle et utilisée uniquement lorsque la détection automatique n'a pas trouvé de codage. Donc, la naissance est plus importante. Voir les détails ci-dessous:

ReadallText (Chemin de chaîne) CODE> - MSDN: "Cette méthode tente de détecter automatiquement le codage" p>

ReadallText (chemin de chaîne, codage de codage) code> - MSDN: "Cette méthode tente de détecter automatiquement le codage" p>

à partir de l'outil de réflecteur: readalltext (chemin) code> est identique à readalltext (chemin, Coding.utf8) code>, parce que readalltext (chemin) code> appelle juste readalltext (chemin, encoding.utf8) code>. Les deux méthodes crée des méthodes de cette manière: p> xxx pré>

ceci signifie qu'il crée StreamReader (chemin de chaîne, codage de codage, codage de codage de codage, intemporisation boolbyteordermarks, int tampersize) code> avec DétecTenCodingFromByTeordermarks défini sur True. Cela signifie que si la marque d'ordre d'octets (BOM) est présente, il utilisera un codage à partir de la nomenclature, si la nomenclature n'est pas présente, elle utilisera le codage fourni. Si la nomenclature n'est pas présente et que le codage n'est pas fourni, il utilisera UTF8. Donc, le utf8 strud> est la valeur réelle dans ce cas, mais rappelez-vous que la nomination est plus importante que le codage suggéré. P>

// bom.txt is the file with BOM present. nobom.txt - witout BOM
File.ReadAllText("bom.txt");                     // use BOM
File.ReadAllText("bom.txt", Encoding.UTF8);      // use BOM
File.ReadAllText("bom.txt", Encoding.Default);   // use BOM
File.ReadAllText("nobom.txt");                   // use UTF-8
File.ReadAllText("nobom.txt", Encoding.UTF8);    // use UTF-8
File.ReadAllText("nobom.txt", Encoding.Default); // use system's ANSI codepage


2 commentaires

Savez-vous s'il y a un moyen de remplacer la naissance, de sorte que le codage.wikever devient la priorité?


@Danw, vous pouvez essayer d'utiliser Nouveau StreamReader ("Brikfile.txt", encoding.whatever, false) . Mais dans ce cas, il traitera probablement de la naissance comme du texte. Vous obtiendrez donc des caractères étranges au début. Assurez-vous de ce que vous faites parce que, lorsque BOM est défini, il est généralement réglé correctement.