none
Como gravar arquivo texto corretamente ?

    Question

  • Olá, senhores.

     

    Meu programa cria um arquivo HTML com todas as tags corretas (<BODY>, <STYLE>, <HEAD>, etc.). Porém, quando eu dou um duplo-clique sobre ele, os caracteres especiais ficam truncados (acentuação, sinais gráficos especiais, etc.).

    Fuçando e "inventando" novas tags (que vi serem desnecessárias) eu abri o arquivo no NotePad e, em determinado momento, SEM MUDAR NADA mandei salvar... pronto: quando eu volto a dar duplo-clique tudo está 100% correto. Fiz isso n-vezes: gerei o arquivo, abri no Internet Explorer... ERRO. Abro e salvo sem nenhuma modificação usando o NotePad e volto abrir com o IE: os caracteres aparecem corretamente.

    Dessa forma, estou pensando que existe alguma coisa que não completei ou não usei o método correto. Estou fazendo assim:

     

      Using sw As StreamWriter = File.CreateText(m_file_name)

        sw.Write(html_text)

      End Using

     

    Neste caso, acima, as variáveis m_file_name e html_text têm o nome do arquivo e todo o conteúdo do arquivo html.

    Está correto ou devo fazer usando outro método?

    O que está flatando para o código de página ser interpretado corretamente?

    ... (no código HTML já estão presentes as tags <meta http-equiv=Content-Type content="text/html; charset=windows-1252">) .

    Por que a gravação do NotePad faz o arquivo ser corretamente interpretado?

    Usando um visualizador, constatei que após o NotePad salvar o arquivo os caracteres "" são acrescentados no início do arquivo. Porém, se eu modifico meu código para:

     

      Using sw As StreamWriter = File.CreateText(m_file_name)

        sw.Write("" & html_text)

      End Using

     ... o VB coloca "" no início de meu arquivo, parecido com o que ele faz com os outros caracteres.

    Ou seja: este modo de gravar ou criar o arquivo é que está errado. Ele transforma o texto em outra coisa que não era pra ser.

    Como contornar isso? Qual método devo usar? Existe parâmetros para a gravação ser adequada ?

     

    Agradecido,

    Ricardo Ildefonso.

    Thursday, September 21, 2006 9:24 PM

Answers

  • Ricardo,

    Deve ser o encoding, eu costumo usar o ISO-8859-1 - mais por causa de acentos e caracteres latinos, mas talvez só isso funcione aí também. Você instancia o seu StreamWriter assim:

    Dim sw As new StreamWriter("c:\Folder\arquivo.txt", false, System.Text.Encoding.GetEncoding("ISO-8859-1"))

    Abraços,
    Francisco
    OK, Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    Thursday, September 21, 2006 9:51 PM
    Moderator

All replies

  • Ricardo,

    Deve ser o encoding, eu costumo usar o ISO-8859-1 - mais por causa de acentos e caracteres latinos, mas talvez só isso funcione aí também. Você instancia o seu StreamWriter assim:

    Dim sw As new StreamWriter("c:\Folder\arquivo.txt", false, System.Text.Encoding.GetEncoding("ISO-8859-1"))

    Abraços,
    Francisco
    OK, Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    Thursday, September 21, 2006 9:51 PM
    Moderator
  • Olá, "São" Francisco.

    Mais uma vez corretíssimo. Meu código ficou assim:

     

      Using sw As New StreamWriter(m_file_name, False, _
         System.Text.Encoding.GetEncoding(
    "ISO-8859-1"))

     

        sw.Write(html_text)

      End Using

    Há uma consideração, porém: eu uso este código na mesma sub por três vezes, para gravar três versões de três arquivos diferentes. Por causa da cláusula Using junto com o New eu não estou confundindo meu ".exe" ? Ou justo por ela estou garantindo toda a integridade?

    Haverá um "Dispose" automático no End Using e, então, posso usar a mesma variável as três vezes?

    Muito obrigado.

    Ricardo Ildefonso.

    Friday, September 22, 2006 12:28 PM
  • Ricardo,

    Cada vez que você usa o "new", um novo objeto é instanciado e a variável que o recebe passa a apontar para ele. Mesmo que você não usasse o using ou fizesse o dispose explicitamente, depois de atribuir um novo objeto para a variável ela deixa de apontar a instância para qual apontava anteriormente.

    Abraços,
    Francisco
    OK, Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    Friday, September 22, 2006 4:10 PM
    Moderator
  • Oi, Francisco.

    "Bão e inteligente asim, você deve ser São-Paulino", né?
    Se não for ainda há tempo de se converter e salvar sua alma...

    Voltando ao outro assunto, entendo que a variável passa a apontar para o novo objeto. Mas e o antigo?

    Ele será eliminado automaticamente ou esperará pelo "garbage-collector" ? Fico estressado porque li que o GC pode levar minutos até passar pela parte de um sub ou function para liberar a memória. Na mesma referência que li, foi afirmado que a estrutura using/end using cria uma forma de disponibiliar os recursos criados nela, o que seria eficiente e seguro. É verdade ou o correto é o dispose, mesmo?

    Até mais,

    Ricardo Ildefonso.

    Saturday, September 23, 2006 12:35 PM
  • Ricardo,

    Errou, sou porco!! hehehehe

    Então, mas o Dispose - que está implicito no using que você está usando - vai liberar os recursos de memória que o StreamWriter estava usando. Quando o GC for destruir o objeto você já terá liberado os recursos de memória com o Dispose.

    Abraços,
    Francisco
    OK, Computer - http://thespoke.net/blogs/fbcjunior/default.aspx

    Saturday, September 23, 2006 1:16 PM
    Moderator