В платформе .NET все строки представлены как UTF-16.
Поэтому нет "строки windows-1251", а есть UTF-16 строка, которая была заполнена символами из источника, в котором символы были сохранены в windows-1251.
Из этого становится виден сценарий:
1. Считать файл байтов, где символы кодируются в windows-1251.
2. Преобразовать в UTF-16
3. Выполнить над строками различные необходимые действия.
4. Сохранить результат с преобразованием в набор байт, где символы представленны как UTF-8.
И пример кода:
1-2. Построчное чтение из файла с windows-1251
using (var stream = new StreamReader(fileName, Encoding.GetEncoding(1251)))
{
while (stream.Peek() >= 0)
{
var line = stream.ReadLine();
}
}
4. Помещаем в тело запроса набор байт, где символы в UTF-8
using (var stream = webRequest.GetRequestStream())
using (var writer = new StreamWriter(stream, Encoding.UTF8))
writer.Write(yourstring);