强制StreamWriter更改编码

Sae*_*ani 28 c# stringbuilder streamwriter

我正在尝试使用DialogResult和保存文件StringBuilder.在制作文本后,我调用以下代码来保存文件:

    if (dr == DialogResult.OK)
    {

        StreamWriter sw = new StreamWriter(saveFileDialog1.FileName);

        sw.Write(sb.ToString());
        sw.Close();
    }
Run Code Online (Sandbox Code Playgroud)

我试图将第二个参数添加到StreamWriteras,Encoding.UTF8但由于第一个参数是a string而不是a Stream,因此它不会编译它.

如何将该字符串转换为流,以便能够将第二个参数作为编码传递?

这样做的原因,是在我的文字是什么地方我有µ,但是当文件被保存它显示像μ这样µ越来越screwd!

谢谢

Pol*_*ial 48

把它包装成一个FileStream.

StreamWriter sw = new StreamWriter(
    new FileStream(saveFileDialog1.FileName, FileMode.Open, FileAccess.ReadWrite),
    Encoding.UTF8
);
Run Code Online (Sandbox Code Playgroud)

如果要追加,请FileMode.Append改用.

你也应该叫Dispose()一上try/finally块,或使用using块,当它超过了处置的对象using范围:

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

这将正确关闭并在所有异常路径中处理流.

  • @TimAbell放置StreamWriter包装器后,它将在基础流上调用Close(),这将隐式处置子流。 (2认同)

Hen*_*man 13

filename,appendMode,encoding有一个构造函数.

使用适当的using块看起来像:

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