2010-12-11 25 views
5

Estoy usando Microsoft.VisualBasic.Fileio.TextFieldParser para analizar un archivo CSV que se creó con Excel 2003. El analizador funciona a la perfección, con la excepción de que está convirtiendo los valores ascii extendidos en signos de interrogación. Así que si el contenido del archivo era:Microsoft.VisualBasic.FileIO.TextFieldParser cambia ± Ascii 241 a? Ascii 63

± 3
El TextFieldParser está volviendo
? 3

He intentado todas las codificaciones del paquete System.Text.Encoding sin suerte. Pensé que lo tenía con UTF7 pero estaba cayendo otros personajes como reemplazar el signo + con un espacio.

Cualquier ayuda sería muy apreciada.

+1

No existe el 'ASCII 241'. El significado de los bytes 128-255 está definido por ** extensiones a ** ASCII, y hay muchos de estos. –

+2

¿Ha comprobado cómo se guarda el archivo? Ábralo en el Bloc de notas y seleccione Guardar como, debe haber un menú desplegable desde donde puede seleccionar la codificación. Compruebe lo que hay allí, sospecho que ANSI. Es posible que desee intentar guardarlo como UTF-8 y luego ejecutarlo nuevamente a través de su aplicación. – Pieter

Respuesta

15

El Microsoft.VisualBasic.Fileio.TextFieldParser se establece por defecto en la codificación UTF8, pero el archivo de texto se encuentra en la codificación ANSI actual del sistema. Utilice uno de los constructores que toman una codificación como: TextFieldParser(string path, Encoding defaultEncoding).

Puede pasar System.Text.Encoding.Default para su codificación o construir un nuevo objeto de codificación pasando en una página de códigos. El valor predeterminado en inglés Windows es 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