强制StreamWriter更改编码

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

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

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

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

这个的原因,是在我的文本中的某个地方我有µ但是当文件被保存时它显示像μ所以µ被搞砸了!

谢谢

只需将其包装在FileStream

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

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

您还应该在try/finally块上调用Dispose() ,或者在超出using范围时使用using块来处置该对象:

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

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

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

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

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

有一个StreamWriter(字符串路径,bool追加,编码编码)构造函数 – 您可以只显式指定追加标志吗?

我说你应该把你的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得到清理(即使在此期间抛出exception,它也会调用sw.Dispose() 。(有些人会说这也意味着你不再需要.Close因为Dispose也会照顾它,但我还是喜欢它。)

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

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