web-dev-qa-db-fra.com

Lire les fichiers txt (en unicode et utf8) au moyen de C #

J'ai créé deux fichiers txt (bloc-notes Windows) avec le même contenu "merci - спасибо" et les ai enregistrés dans utf8 et unicode. Dans le bloc-notes, ils ont l'air bien. Ensuite, j'ai essayé de les lire en utilisant .Net:

...File.ReadAllText(utf8FileFullName, Encoding.UTF8);

et

...File.ReadAllText(unicodeFileFullName, Encoding.Unicode);

Mais dans les deux cas, j'ai reçu ce "merci - ???????". Qu'est-ce qui ne va pas?

Upd: code pour utf8

static void Main(string[] args)
        {
            var encoding = Encoding.UTF8;
            var file = new FileInfo(@"D:\encodes\enc.txt");
            Console.OutputEncoding = encoding;
            var content = File.ReadAllText(file.FullName, encoding);
            Console.WriteLine("encoding: " + encoding);
            Console.WriteLine("content: " + content);
            Console.ReadLine();
        }

Résultat: merci ÑпР° ÑиР± о

17
mtkachenko

Modifié comme UTF8 devrait prendre en charge les caractères. Il semble que vous effectuez une sortie vers une console ou un emplacement dont le codage n'a pas été défini. Si c'est le cas, vous devez définir l'encodage. Pour la console, vous pouvez le faire

string allText = File.ReadAllText(unicodeFileFullName, Encoding.UTF8);
Console.OutputEncoding = Encoding.UTF8;
Console.WriteLine(allText);
16
keyboardP

Utilisez le type de codage par défaut

File.ReadAllText(unicodeFileFullName, Encoding.Default);

Il corrigera les caractères ????.

5
alireza amini

Lors de la sortie de caractères multi-octets codés Unicode ou UTF-8 sur la console, vous devrez définir le codage et vous assurer que la console dispose d'un jeu de polices qui prend en charge le caractère multi-octets afin d'afficher le glyphe correspondant. Avec votre code existant, un MessageBox.Show (contenu) ou un affichage sur un Windows ou un formulaire Web apparaîtrait correctement.

Jetez un œil à http://msdn.Microsoft.com/en-us/library/system.console.aspx pour une explication sur la définition des polices dans la fenêtre de la console.

" La prise en charge des caractères Unicode nécessite que l'encodeur reconnaisse un caractère Unicode particulier et nécessite également une police possédant les glyphes nécessaires pour le rendu de ce caractère. Pour afficher correctement les caractères Unicode sur la console, la console la police doit être définie sur une police non raster ou TrueType telle que Consolas ou Lucida Console. "

En guise de remarque, vous pouvez utiliser la classe FileStream pour lire les trois premiers octets du fichier et rechercher l'indicateur de marque d'ordre des octets pour définir automatiquement l'encodage lors de la lecture du fichier. Par exemple, si l'octet [0] == 0xEF && l'octet [1] == 0xBB && l'octet [2] == 0xBF alors vous avez un fichier encodé UTF-8. Reportez-vous à http://en.wikipedia.org/wiki/Byte_order_mark pour plus d'informations.

3
Warren Rox