Ответ 1
Ну, он пишет спецификацию, потому что вы ее инструктируете в строке
Encoding utf8WithoutBom = new UTF8Encoding(true);
true
означает, что спецификация должна быть испущена, используя
Encoding utf8WithoutBom = new UTF8Encoding(false);
не записывает спецификацию.
Моя цель - создать файл с использованием UTF-8 в качестве кодировки и 8859-1 как CharSet
К сожалению, это невозможно, либо вы пишете UTF-8, либо нет. То есть пока персонажи, которые вы пишете, присутствуют в ISO Latin-1, он будет выглядеть как файл ISO 8859-1, однако, как только вы выведете символ, который не подпадает под действие стандарта ISO 8859-1 (например, ä, ö, ü ) эти символы будут записаны как многобайтовые символы.
Чтобы записать истинный ISO-8859-1, используйте:
Encoding isoLatin1Encoding = Encoding.GetEncoding("ISO-8859-1");
Изменить: После комментария balexandre
Я использовал следующий код для тестирования...
var filePath = @"c:\temp\test.txt";
var sb = new StringBuilder();
sb.Append("dsfaskd jlsadfj laskjdflasjdf asdkfjalksjdf lkjdsfljas dddd jflasjdflkjasdlfkjasldfl asääääjdflkaslj d f");
Encoding isoLatin1Encoding = Encoding.GetEncoding("ISO-8859-1");
TextWriter tw = new StreamWriter(filePath, false, isoLatin1Encoding);
tw.WriteLine(sb.ToString());
tw.Close();
И файл выглядит отлично. Очевидно, что вы должны использовать ту же самую кодировку при чтении файла.