强制StreamWriter更改编码

时间:2011-11-16 12:05:49

标签: c# stringbuilder streamwriter

我正在尝试使用DialogResultStringBuilder保存文件。在制作文本后,我调用以下代码来保存文件:

    if (dr == DialogResult.OK)
    {

        StreamWriter sw = new StreamWriter(saveFileDialog1.FileName);

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

我尝试将第二个参数添加到StreamWriter Encoding.UTF8,但由于第一个参数是string而不是Stream,因此它不会编译它。< / p>

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

原因在于,我的文字中有µ,但文件保存后显示为μ,因此µ被搞砸了!

由于

5 个答案:

答案 0 :(得分:47)

将其包装在FileStream

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

如果您想要追加,请改用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());
}

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

答案 1 :(得分:12)

有一个构造函数,用于filename,appendMode,encoding。

使用正确的using块看起来像:

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

答案 2 :(得分:2)

有一个StreamWriter(string path, bool append, Encoding encoding)构造函数 - 你也可以显式指定append标志吗?

我说你应该将你的StreamWriter包装在using中,即

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

虽然实际上这不会有任何区别。这有效地在代码周围进行了try / finally,以便StreamWriter得到清理(即使在此期间抛出异常,它也会调用sw.Dispose()。(有些人会说这也意味着你不再需要.Close因为Dispose也会处理这个问题,但无论如何我更愿意接受它。)

答案 3 :(得分:2)

设置使用阿拉伯字体的UTF8编码是我做过的最好的事情:

 using (var sw = new StreamWriter(

 new FileStream(temporaryFilePath,    
               FileMode.Create,
               FileAccess.ReadWrite), 
               Encoding.UTF8))
            {
                sw.Write(sb.ToString());
            }
 )

答案 4 :(得分:0)

最简单的方法是使用正确的构造函数。

StreamWriter(String, Boolean, Encoding)

使用指定的编码和默认缓冲区大小为指定的文件初始化StreamWriter类的新实例。如果文件存在,则可以将其覆盖或附加。如果该文件不存在,则此构造方法将创建一个新文件。

C#

public StreamWriter (string path, bool append, System.Text.Encoding encoding);