2012-05-25 12 views
6

Im leer un archivo con ReadAllTextCómo utilizar ReadAllText cuando la codificación de archivos desconocido

String[] values = File.ReadAllText(@"c:\\c\\file.txt").Split(';'); 

    int i = 0; 

    foreach (String s in values) 
    { 
     System.Console.WriteLine("output: {0} {1} ", i, s); 
     i++; 
    } 

Si trato de leer algunos archivos a veces tengo la espalda del carácter incorrecto (por ÖÜÄÀ ...). La salida es similar, es porque hay algún problema con la codificación '?':

output: 0 TEST 
output: 1 A??O? 

Una solución sería la de establecer la codificación en ReadAllText, digamos algo así como ReadAllText(@"c:\\c\\file.txt", Encoding.UTF8) que podría solucionar el problema. Pero, ¿y si todavía pudiera obtenerlo? como salida? ¿Qué sucede si no conozco la codificación del archivo? ¿Y qué pasa si cada archivo tiene una codificación diferente? ¿Cuál sería la mejor manera de hacerlo con C#? Gracias

+1

Usted necesita saber cuál es la codificación. Y no hay una forma 100% confiable de averiguar basándose únicamente en el contenido del archivo. –

+0

Por favor refiérase a este post http://stackoverflow.com/questions/2239968/c-sharp-file-readalltext-doing-weird-things – Dhaval

Respuesta

6

La única manera de hacer esto de manera confiable es buscar byte order marks al comienzo del archivo de texto. (Este blob más generalmente representa la endianidad de la codificación de caracteres utilizada, pero también la codificación, por ejemplo, UTF8, UTF16, UTF32). Desafortunadamente, este método solo funciona para codificaciones basadas en Unicode, y nada antes de eso (para lo cual deben usarse métodos mucho menos confiables).

El tipo StreamReader apoya la detección de estas marcas para determinar la codificación - sólo hay que pasar una bandera para el parámetro como tal:

new System.IO.StreamReader("path", true) 

entonces usted puede comprobar el valor de stremReader.CurrentEncoding para determinar la codificación utilizada por el archivo. Sin embargo, tenga en cuenta que si no existen marcas de codificación de bytes, entonces CurrentEncoding tendrá como valor predeterminado Encoding.Default.

Refer codeproject solution to detect encoding

+3

Si no existen signos de bytes de codificación, entonces CurrentEncoding utilizará Encoding.UTF8 ** no ** Encoding.Default. "El parámetro detectEncodingFromByteOrderMarks detecta la codificación mirando los primeros tres bytes de la secuencia. Reconoce automáticamente el texto Unicode UTF-8, little-endian Unicode y big-endian si el archivo comienza con las marcas de orden de bytes apropiadas. UTF8Encoding se usa ". [de los documentos] (http://msdn.microsoft.com/en-us/library/9y86s1a9.aspx) – MarkJ

5

usted tiene que comprobar la codificación de archivos primero. intente esto

System.Text.Encoding enc = null; 
System.IO.FileStream file = new System.IO.FileStream(filePath, 
    FileMode.Open, FileAccess.Read, FileShare.Read); 
if (file.CanSeek) 
{ 
    byte[] bom = new byte[4]; // Get the byte-order mark, if there is one 
    file.Read(bom, 0, 4); 
    if ((bom[0] == 0xef && bom[1] == 0xbb && bom[2] == 0xbf) || // utf-8 
     (bom[0] == 0xff && bom[1] == 0xfe) || // ucs-2le, ucs-4le, and ucs-16le 
     (bom[0] == 0xfe && bom[1] == 0xff) || // utf-16 and ucs-2 
     (bom[0] == 0 && bom[1] == 0 && bom[2] == 0xfe && bom[3] == 0xff)) // ucs-4 
    { 
     enc = System.Text.Encoding.Unicode; 
    } 
    else 
    { 
     enc = System.Text.Encoding.ASCII; 
    } 

    // Now reposition the file cursor back to the start of the file 
    file.Seek(0, System.IO.SeekOrigin.Begin); 
} 
else 
{ 
    // The file cannot be randomly accessed, so you need to decide what to set the default to 
    // based on the data provided. If you're expecting data from a lot of older applications, 
    // default your encoding to Encoding.ASCII. If you're expecting data from a lot of newer 
    // applications, default your encoding to Encoding.Unicode. Also, since binary files are 
    // single byte-based, so you will want to use Encoding.ASCII, even though you'll probably 
    // never need to use the encoding then since the Encoding classes are really meant to get 
    // strings from the byte array that is the file. 

    enc = System.Text.Encoding.ASCII; 
} 
+0

¡Gracias! Tenga en cuenta que FileStream está abierto después de este código y debe cerrarse si este código se usa en algún método 'GetEncoding'. – Tieme

Cuestiones relacionadas