Forzar a StreamWriter a cambiar la codificación


Estoy intentando guardar un archivo usando DialogResult y StringBuilder. Después de hacer el texto, estoy llamando al siguiente código para guardar el archivo:

    if (dr == DialogResult.OK)
    {

        StreamWriter sw = new StreamWriter(saveFileDialog1.FileName);

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

Traté de agregar el segundo parámetro a StreamWriter como Encoding.UTF8 pero como el primer argumento es un string en lugar de un Stream, no lo compila.

¿Cómo puedo convertir esa cadena en un flujo para poder pasar el segundo parámetro como Codificación?

La razón de esto, es que en algún lugar de mi texto tengo µ pero cuando el archivo es guardado se muestra como {[8] } por lo que el µ está recibiendo screwd!

Gracias

Author: Saeid Yazdani, 2011-11-16

4 answers

Simplemente envuélvalo en un FileStream.

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

Si desea agregar, use FileMode.Append en su lugar.

También debe llamar a Dispose() en un bloque try/finally, o usar un bloque using para eliminar el objeto cuando exceda el alcance using:

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

Esto cerrará y eliminará correctamente los flujos a través de todas las rutas de excepción.

 42
Author: Polynomial,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-16 12:14:21

Hay un constructor para filename, appendMode, encoding.

Con un bloque apropiado using se ve como:

if (dr == DialogResult.OK)
{
    using (StreamWriter sw = new StreamWriter(saveFileDialog1.FileName, 
           false, Encoding.UTF8))
    {
      sw.Write(sb.ToString());
      //sw.Close();
    }
}
 11
Author: Henk Holterman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-16 12:20:01

Hay un constructor StreamWriter(string path, bool append, Encoding encoding) - ¿podría especificar explícitamente el indicador append también?

Dije que deberías envolver tu StreamWriter en un using también, es decir,

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

Aunque realista esto no hará ninguna diferencia aquí. Esto efectivamente pone un try / finally alrededor del código para que el StreamWriter se limpie (llamará sw.Dispose() incluso si se lanza una excepción mientras tanto. (Algunas personas dirá que esto también significa que ya no necesita el .Close ya que la Disposición se encargará de eso también, pero prefiero tenerlo de todos modos.)

 2
Author: Rup,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-11-16 12:18:20

Establecer la codificación UTF8 trabajar con fuente árabe es lo mejor que hice:

 using (var sw = new StreamWriter(

 new FileStream(temporaryFilePath,    
               FileMode.Create,
               FileAccess.ReadWrite), 
               Encoding.UTF8))
            {
                sw.Write(sb.ToString());
            }
 )
 2
Author: Akif Irshad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-09 07:57:17