Допустим, у меня есть файл и у него может быть любая кодировка. Как с помощью StreamReader корректно прочитать данные из этого файла, чтобы потом записать их в другой файл с кодировкой UTF-8?
Ответ
Никак. Гарантировано рабочего решения не существует. Для того, чтобы работать с текстовым файлом, система обязана знать его кодировку.
Что вы можете попробовать:
Используйте StreamReader без указания кодировки. Он попробует продетектировать, и в нормальных случаях (а это означает обычно Unicode-кодировки) ему это удаётся.
Попробуйте сдетектировать кодировку на основе частотного анализа. Если вам известен язык, на котором написан ваш текст, вы можете определить относительную частоту символов в текстах (это будет ожидаемое распределение частот), попробовать пооткрывать текст в кодировках, релевантных для этого языка (например, для русского языка это CP1251, CP866, KOI8-R и т. п.), и посмотреть, в какой из них распределение частот символов будет ближе всего к той самой относительной частоте. (Это реализовано, например, в редакторе Far Manager'а).
В ответах на этот вопрос есть несколько примеров с кодом, комбинирующих эти подходы.
В любом случае, на будущее: текст не имеет права храниться без кодировки. Текст без кодировки — никому не нужные данные. Всегда знайте кодировку, в которой лежит ваш текст.
Если же вы знаете кодировку файла, то всё гораздо проще:
var srcEncoding = Encoding.GetEncoding(1251);
var dstEncoding = Encoding.UTF8;
using (var src = new StreamReader(srcFileName, encoding: srcEncoding))
using (var dst = new StreamWriter(dstFileName, append: false, encoding: dstEncoding))
{
string line;
while ((line = src.ReadLine()) != null)
dst.WriteLine(line);
}
Комментариев нет:
Отправить комментарий