2010-12-11 6 views
5

J'utilise Microsoft.VisualBasic.Fileio.TextFieldParser pour analyser un fichier CSV qui a été créé avec Excel 2003. L'analyseur fonctionne très bien, sauf qu'il convertit les valeurs ascii étendues en points d'interrogation! Donc, si le contenu du fichier était:Microsoft.VisualBasic.FileIO.TextFieldParser change ± Ascii 241 à? Ascii 63

± 3
Le TextFieldParser revient
? 3

J'ai essayé tous les encodages dans le package System.Text.Encoding sans succès. Je pensais que je l'avais avec UTF7 mais il laissait tomber d'autres caractères comme le remplacement du signe + avec un espace.

Toute aide serait grandement appréciée.

+1

Il n'existe pas de 'ASCII 241'. La signification des octets 128-255 est définie par ** extensions de ** ASCII, et il y en a beaucoup. –

+2

Avez-vous vérifié ce que le fichier est enregistré en tant que? Ouvrez-le dans le Bloc-notes et sélectionnez Enregistrer sous, il devrait y avoir une liste déroulante à partir de laquelle vous pouvez sélectionner l'encodage. Vérifiez ce qu'il y a, je soupçonne ANSI. Vous pouvez essayer de l'enregistrer en tant que UTF-8, puis le réexécuter dans votre application. – Pieter

Répondre

15

Microsoft.VisualBasic.Fileio.TextFieldParser utilise par défaut le codage UTF8, mais le fichier texte est dans le codage ANSI actuel du système. Utilisez l'un des constructeurs qui prennent un codage comme: TextFieldParser(string path, Encoding defaultEncoding).

Vous pouvez passer en System.Text.Encoding.Default pour votre encodage ou construire un nouvel objet de codage passant dans une page de code. La valeur par défaut sur Windows anglais est 1252.

0
Dim s As String = "± 3" 
    'this produces the ? 
    Dim b() As Byte = System.Text.ASCIIEncoding.ASCII.GetBytes(s) 

    'try this 
    Dim anEncoding As System.Text.Encoding = System.Text.Encoding.GetEncoding(28591) 
    b = anEncoding.GetBytes(s) 

    s = anEncoding.GetChars(b) 'check to see if it round-trips