2012-05-25 11 views
6

Im lettura di un file con ReadAllTextCome utilizzare ReadAllText quando la codifica di file sconosciuto

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++; 
    } 

Se provo a leggere alcuni file ottengo a volte il carattere errato posteriore (per ÖÜÄÀ ...). L'uscita è come, la sua perché c'è qualche problema con la codifica '?':

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

Una soluzione potrebbe essere quella di impostare la codifica in ReadAllText, consente di dire una cosa del genere ReadAllText(@"c:\\c\\file.txt", Encoding.UTF8) che potrebbe risolvere il problema. Ma cosa succede se otterrei ancora '?' come uscita? Cosa succede se non conosco la codifica del file? E se ogni singolo file avesse una codifica diversa? Quale sarebbe il modo migliore per farlo con C#? Grazie

+1

Hai bisogno di sapere che cos'è la codifica. E non esiste un modo affidabile al 100% per scoprirlo basandosi esclusivamente sul contenuto del file. –

+0

Si prega di fare riferimento a questo post http://stackoverflow.com/questions/2239968/c-sharp-file-readalltext-doing-weird-things – Dhaval

risposta

6

L'unico modo per farlo in modo affidabile è cercare byte order marks all'inizio del file di testo. (Questo blob rappresenta in generale la endianità della codifica dei caratteri utilizzata, ma anche la codifica, ad esempio UTF8, UTF16, UTF32). Sfortunatamente, questo metodo funziona solo per le codifiche basate su Unicode e nulla prima (per cui devono essere usati metodi molto meno affidabili).

Il tipo StreamReader supporta rilevare questi segni per determinare la codifica - è sufficiente passare una bandiera per il parametro come ad esempio:

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

È possibile quindi controllare il valore di stremReader.CurrentEncoding per determinare la codifica utilizzata da il file. Si noti tuttavia che se non esistono segni di codifica dei byte, allora CurrentEncoding verrà impostato su Encoding.Default.

Refer codeproject solution to detect encoding

+3

Se non esistono segni di codifica di byte, quindi CurrentEncoding userà Encoding.UTF8 ** non ** Encoding.Default. "Il parametro detectEncodingFromByteOrderMarks rileva la codifica osservando i primi tre byte dello stream e riconosce automaticamente UTF-8, little-endian Unicode e big-endian Unicode text se il file inizia con i contrassegni di ordine dei byte appropriati. UTF8Encoding è usato. " [dai documenti] (http://msdn.microsoft.com/en-us/library/9y86s1a9.aspx) – MarkJ

5

Devi controllare la codifica di file prima. prova questo

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

Grazie! Si noti che FileStream è aperto dopo questo codice e dovrebbe essere chiuso se questo codice viene utilizzato in un metodo 'GetEncoding'. – Tieme

Problemi correlati