Как использовать ReadAllText, когда кодировка файла неизвестна

Я читаю файл сReadAllText

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

Если я пытаюсь прочитать некоторые файлы, иногда получаю неправильный символ (для & # xD6; & # xDC; & # xC4; & # xC0; ...). Вывод похож на «?», Потому что есть некоторые проблемы с кодировкой:

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

Одним из решений было бы установить кодировку в ReadAllText, скажем, что-то вродеReadAllText(@"c:\\c\\file.txt", Encoding.UTF8) это может решить проблему. Но что, если я все еще получу «?» как вывод? Что если я не знаю кодировку файла? А что если каждый файл имеет свою кодировку? Что было бы лучшим способом сделать это с C #? Спасибо

 David Heffernan25 мая 2012 г., 13:20
Вам нужно знать, что такое кодировка. И нет 100% надежного способа выяснить, основываясь исключительно на содержимом файла.
 Dhaval25 мая 2012 г., 13:25
Пожалуйста, обратитесь к этому сообщениюstackoverflow.com/questions/2239968/…

Ответы на вопрос(2)

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; 
}
 30 янв. 2016 г., 14:39
Спасибо! Обратите внимание, что FileStream открывается после этого кода и должен быть закрыт, если этот код используется в некоторыхGetEncoding метод.
Решение Вопроса

метки порядка байтов в начале текстового файла. (Этот BLOB-объект в более общем смысле представляет порядковый номер используемой кодировки символов, но также и кодировку - например, UTF8, UTF16, UTF32). К сожалению, этот метод работает только для кодировок на основе Unicode, и ничего до этого (для чего должны использоваться гораздо менее надежные методы).

StreamReader type поддерживает обнаружение этих меток для определения кодировки - вам просто нужно передать флаг параметру как таковой:

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

Затем вы можете проверить значениеstremReader.CurrentEncoding определить кодировку, используемую файлом. Тем не менее, обратите внимание, что если меток кодирования байтов не существует, тоCurrentEncoding по умолчанию будетEncoding.Default.

Обратитесь к решению codeproject для определения кодировки

 01 июн. 2012 г., 16:17
Если меток кодирования байтов не существует, то CurrentEncoding будет использовать Encoding.UTF8not Encoding.Default. & quot; Параметр detectEncodingFromByteOrderMarks обнаруживает кодировку, просматривая первые три байта потока. Он автоматически распознает UTF-8, Unicode с прямым порядком байтов и Unicode с прямым порядком байтов, если файл начинается с соответствующих меток порядка байтов. В противном случае используется кодировка UTF8. & Quot;from the docs

Ваш ответ на вопрос