web-dev-qa-db-ja.com

StreamWriterにエンコードの変更を強制する

DialogResultStringBuilderを使用してファイルを保存しようとしています。テキストを作成した後、次のコードを呼び出してファイルを保存します。

    if (dr == DialogResult.OK)
    {

        StreamWriter sw = new StreamWriter(saveFileDialog1.FileName);

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

2番目のパラメーターをStreamWriterEncoding.UTF8として追加しようとしましたが、最初の引数はstringではなくStreamであるため、コンパイルされません。

2番目のパラメーターをエンコードとして渡すことができるように、その文字列をストリームに変換するにはどうすればよいですか?

その理由は、テキストのどこかにµがありますが、ファイルを保存するとμのように表示されるため、µがねじ込まれているからです。

ありがとう

28
Saeid Yazdani

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());
}
_

これにより、すべての例外パスでストリームが適切に閉じられ、破棄されます。

47
Polynomial

Filename、appendMode、エンコーディングのコンストラクタがあります。

適切なusingブロックを使用すると、次のようになります。

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

アラビア語フォントで動作するUTF8エンコーディングを設定することが、私がしたことの中で最高です。

 using (var sw = new StreamWriter(

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

StreamWriter(string path、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();
    }
}
_

現実的には、これはここでは何の違いも生じません。これにより、コードに事実上try/finallyが配置され、StreamWriterがクリーンアップされます(その間に例外がスローされた場合でも、sw.Dispose()が呼び出されます。 _.Close_が必要になるのは、Disposeでも処理されるためです。

2
Rup