强制StreamWriter更改编码
我试图使用DialogResult
和StringBuilder
保存文件。 在制作文本后,我调用以下代码来保存文件:
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()); } )