web-dev-qa-db-fra.com

Aide C # pour lire des caractères étrangers à l'aide de StreamReader

J'utilise le code ci-dessous pour lire un fichier texte contenant des caractères étrangers. Le fichier est codé en ANSI et va bien dans le bloc-notes. Le code ci-dessous ne fonctionne pas. Lorsque les valeurs du fichier sont lues et affichées dans la grille de données, les caractères apparaissent sous forme de carrés. Y at-il un autre problème ailleurs?

StreamReader reader = new StreamReader(inputFilePath, System.Text.Encoding.ANSI);
using (reader = File.OpenText(inputFilePath))

Merci

Update 1 : J'ai essayé tous les encodages trouvés sous System.Text.Encoding. et tous ne parviennent pas à afficher le fichier correctement.

Mise à jour 2 : J'ai modifié l'encodage du fichier (enregistré de nouveau) en unicode et utilisé System.Text.Encoding.Unicode. Cela a fonctionné correctement. Alors, pourquoi le bloc-notes l'a-t-il lu correctement? Et pourquoi System.Text.Encoding.Unicode n'a-t-il pas lu le fichier ANSI?

55
Scott

Oui, cela pourrait être avec l'encodage réel du fichier, probablement unicode. Essayez UTF-8 car il s’agit de la forme la plus courante de codage Unicode. Sinon, si le fichier ASCII, l'encodage standard ASCII devrait fonctionner.

23
Quintin Robinson

Vous pouvez également essayer le codage par défaut, qui utilise la page de codes ANSI du système actuel.

StreamReader reader = new StreamReader(inputFilePath, Encoding.Default, true)

Lorsque vous essayez d'utiliser le menu "Enregistrer sous" du Bloc-notes avec le fichier d'origine, examinez la liste déroulante Codage. Il vous dira quel bloc-notes d'encodage deviné est utilisé par le fichier.

De plus, s'il s'agit d'un fichier ANSI, le paramètre detectEncodingFromByteOrderMarks ne vous aidera probablement pas beaucoup.

117
Jerome Laban

J'ai eu le même problème et ma solution était simple: au lieu de

Encoding.ASCII

utilisation

Encoding.GetEncoding("iso-8859-1")

La réponse a été trouvée ici .

Edit: plus de solutions. Celui-ci peut-être plus précis:

Encoding.GetEncoding(1252);

En outre, dans certains cas, cela fonctionnera aussi si le codage par défaut de votre système d'exploitation correspond au codage de fichier:

Encoding.Default;
21
serop

L'utilisation de Encoding.Unicode ne décodera pas avec précision un fichier ANSI de la même manière qu'un décodeur JPEG ne comprendra pas un fichier GIF.

Je suis surpris que Encoding.Default ne fonctionne pas pour le fichier ANSI s'il était réellement ANSI - si vous découvriez exactement quelle page de code utilisait le Bloc-notes, vous pouvez utiliser Encoding.GetEncoding(int) .

En général, dans la mesure du possible, je vous recommanderais d'utiliser UTF-8.

8
Jon Skeet

Essayez un autre encodage tel que Encoding.UTF8. Vous pouvez également essayer de laisser StreamReader trouver le codage lui-même:

    StreamReader reader = new StreamReader(inputFilePath, System.Text.Encoding.UTF8, true)

Edit: vient de voir votre mise à jour. Essayez de laisser StreamReader deviner.

7
Jakob Christensen

File.OpenText () utilise toujours implicitement un UTF-8 StreamReader. Créez votre propre StreamReader instance à la place et spécifiez le codage souhaité . comme 

using (StreamReader reader =  new StreamReader(@"C:\test.txt", Encoding.Default)
 {
 // ...
 }
3
Anonymous

J'ai résolu mon problème de lecture des caractères portugais en modifiant le fichier source sur le bloc-notes ++.

enter image description here

C #  

    var url = System.Web.HttpContext.Current.Server.MapPath(@"~/Content/data.json");
    string s = string.Empty;
    using (System.IO.StreamReader sr = new System.IO.StreamReader(url, System.Text.Encoding.UTF8,true))
    {
          s = sr.ReadToEnd();
    }
0
Luís Ponciano

Je lis aussi un fichier exporté qui contient les langues française et allemande. J'ai utilisé Encoding.GetEncoding ("iso-8859-1"), vrai qui a fonctionné sans aucun défi.

0
A. Lartey

pour l'arabe, j'ai utilisé Encoding.GetEncoding(1256). ça marche bien.

0
Muhamad Suliman

Pour le suédois Å Ä Ö, la seule solution parmi celles ci-dessus était la suivante:

Encoding.GetEncoding("iso-8859-1")

Espérons que cela fera gagner du temps à quelqu'un.

0
jagge123