Заставить StreamWriter изменить кодировку - PullRequest
28 голосов
/ 16 ноября 2011

Я пытаюсь сохранить файл, используя DialogResult и StringBuilder. После написания текста я вызываю следующий код для сохранения файла:

    if (dr == DialogResult.OK)
    {

        StreamWriter sw = new StreamWriter(saveFileDialog1.FileName);

        sw.Write(sb.ToString());
        sw.Close();
    }

Я попытался добавить второй параметр к StreamWriter как Encoding.UTF8, но поскольку первый аргумент - string, а не Stream, он не компилируется.

Как я могу преобразовать эту строку в поток, чтобы иметь возможность передавать второй параметр как кодирование?

Причина этого в том, что где-то в моем тексте у меня есть µ, но когда файл сохраняется, он показывает как μ, так что µ становится ввернутым!

Спасибо

Ответы [ 4 ]

47 голосов
/ 16 ноября 2011

Просто оберните его в FileStream.

StreamWriter sw = new StreamWriter(
    new FileStream(saveFileDialog1.FileName, FileMode.Open, FileAccess.ReadWrite),
    Encoding.UTF8
);

Если вы хотите добавить, используйте FileMode.Append вместо.

Вы также должны позвонить Dispose() на try/finally block или используйте блок using для удаления объекта, когда он превышает область действия using:

using(
    var sw = new StreamWriter(
        new FileStream(saveFileDialog1.FileName, FileMode.Open, FileAccess.ReadWrite),
        Encoding.UTF8
    )
)
{
    sw.Write(sb.ToString());
}

Это приведет к правильному закрытию и удалению потоков по всем путям исключений.

12 голосов
/ 16 ноября 2011

Существует конструктор для имени файла, appendMode, encoding.

При правильном блоке using это выглядит так:

if (dr == DialogResult.OK)
{
    using (StreamWriter sw = new StreamWriter(saveFileDialog1.FileName, 
           false, Encoding.UTF8))
    {
      sw.Write(sb.ToString());
      //sw.Close();
    }
}
2 голосов
/ 09 апреля 2013

Настройка кодировки UTF8 для арабского шрифта - лучшее, что я сделал:

 using (var sw = new StreamWriter(

 new FileStream(temporaryFilePath,    
               FileMode.Create,
               FileAccess.ReadWrite), 
               Encoding.UTF8))
            {
                sw.Write(sb.ToString());
            }
 )
2 голосов
/ 16 ноября 2011

Существует StreamWriter (строковый путь, bool append, Encoding encoding) конструктор - вы также можете просто явно указать флаг добавления?

Я сказал, что вы должны обернуть ваш StreamWriter вusing тоже, т. е.

if (dr == DialogResult.OK)
{
    using(StreamWriter sw = new StreamWriter(saveFileDialog1.FileName, false, Encoding.UTF8)) {
        sw.Write(sb.ToString());
        sw.Close();
    }
}

, хотя реально это здесь не имеет никакого значения.Это эффективно помещает попытку / наконец в код, так что StreamWriter будет очищен (он будет вызывать sw.Dispose(), даже если за это время возникнет исключение. (Некоторые люди скажут, что это также означает, что вам больше не нужен *).1012 * так как Dispose позаботится об этом тоже, но я все равно предпочитаю иметь его.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...