2012-10-17 5 views
4

Si je lis un fichier texte à l'aide de FileIO.ReadTextAsync, ReadLinesAsync ou DataReader, je ne peux spécifier qu'un membre de l'énumération UnicodeEncoding pour l'encodage. Cela inclut pour une raison quelconque Utf8, Utf16BE et Utf16LE. Comment puis-je lire un fichier texte avec un autre encodage (comme Windows-1252 ou même Unicode standard (avec 2 octets pour tous les caractères)) alors?Comment lire un fichier texte avec un autre encodage que UFT8 ou UTF16 dans WinRT?

Cela peut être important si Windows Store Apps partage des fichiers texte avec des applications de bureau ou lit des fichiers texte sur Internet.

+0

Ce n'est pas pour « une raison », c'est un arrêt difficile à l'lossage sans fin de la lecture des fichiers texte avec le mauvais encodage. Utf-16 est 'Unicode régulier' et utilise 2 octets. Vous pouvez le faire vous-même en lisant des données binaires et en convertissant du texte avec la classe Encoding. –

+0

Merci Hans. Je ne savais pas que Encoding.Unicode est en fait UTF-16 LE (qui utilise en réalité 2 ou 4 octets). J'ai supposé la même raison pour le "arrêt dur" mais je voulais savoir à coup sûr. Cela a du sens. La lecture des fichiers UTF-8 ou UTF-16 avec BOM réussit toujours, même si je passe le mauvais encodage (qui est évidemment ignoré quand une nomenclature est présente). Eh bien, nous pourrions toujours rencontrer des problèmes lors de la lecture d'un fichier texte codé UTF sans nomenclature (j'ai vérifié cela). Mais un tel fichier serait très rare. Merci pour l'indice à Encoding.GetString. J'ai oublié à ce sujet :-) Aurait marqué comme réponse. –

Répondre

4

Le commentaire de Hans a donné la réponse à ma question. Exemple pour Windows 1252:

string filePath = ... 
StorageFile file = await StorageFile.GetFileFromPathAsync(filePath); 
IBuffer buffer = await FileIO.ReadBufferAsync(file); 
byte[] fileData = buffer.ToArray(); 
Encoding encoding = Encoding.GetEncoding("Windows-1252"); 
string text = encoding.GetString(fileData, 0, fileData.Length); 
0

@ JürgenBayer buffer.ToArray() n'était pas disponible pour moi.

Ainsi, au lieu d'écrire:

string text = await FileIO.ReadTextAsync(file); 

je l'ai écrit:

IBuffer buffer = await FileIO.ReadBufferAsync(file); 
byte[] fileData; 
CryptographicBuffer.CopyToByteArray(buffer, out fileData); 
Encoding encoding = Encoding.GetEncoding("Windows-1252"); 
string text = encoding.GetString(fileData, 0, fileData.Length); 
+0

ToArray est une méthode d'extension de la classe WindowsRuntimeBufferExtensions disponible si l'espace de noms System.Runtime.InteropServices.WindowsRuntime est inclus. Mais ton code a l'air bien aussi :-) –

Questions connexes