none
Arquivo txt codificado RRS feed

  • Pergunta

  • Bom dia galera,

    Estou fazendo uma aplicação Silverlight onde tenho um botão que pesquisa um arquivo .txt, uso "OpenFileDialog" para fazer a pesquisa do arquivo e para abri-lo.

    Após feita a seleção do arquivo e o clique no botão "Abrir" que possui no controle "OpenFileDialog", ele carrega tudo o que está no meu arquivo .txt dentro de um "Stream", uso o "StreamReader" para efetuar a leitura do arquivo .txt e armazenar tudo em um List<>.

    Segue abaixo o código usado para abrir o arquivo e ler todo o arquivo.

    Stream fileStream = _openFileDialog.File.OpenRead();
    arquivoTextBox.Text = _openFileDialog.File.Name;
    
    StreamReader reader = new StreamReader(fileStream);
    
    listaLinhasArquivo = new List<arquivoBancoDeDados>();
    while (!reader.EndOfStream)
    {
    	arquivoBancoDeDados arquivo = new arquivoBancoDeDados();
    	arquivo.linhaArquivo = reader.ReadLine();
    
    	if (arquivo.linhaArquivo != "")
    	{
    		numeroLinhas++;
    		listaLinhasArquivo.Add(arquivo);
    	}
    }
    reader.Close();

    Esse arquivo selecionado, eu mesmo abri o "Notepad" e criei ele, e ele salva automaticamente com a Codificação ANSI.

    Dificuldade: Ao abrir o arquivo se ele contém algum carácter acentuado, na hora da leitura (while) ele passa as informações do arquivo e os caracteres que estão acentuados ele passa com simbolos, ao invés de passar o carácter certo acentuado.

    Tentei fazer um Encoding no meu StreamReader e ele da a mensagem que não é suportador.

    Gostaria de saber algum jeito que eu possa ler o meu arquivo com os caracteres acentuados, se eu preciso mudar a chamada do meu arquivo, se eu tenho que mudar o StreamReader para algum outro jeito melhor e prático.

    Desde já agradeço a ajuda de todos.

    Att.

    quinta-feira, 10 de abril de 2014 13:55

Todas as Respostas

  • Sugiro que você mude o encoding do seu arquivo para algo como Unicode ou UTF-8. Para fazer isso é bem simples, basta abrir o arquivo no notepad, escolher a opção "Salvar como" e mudar o encoding usando o dropdown que tem ao lado do botão Salvar. Pode sobrescrever o arquivo que da próxima vez que ele for editado o novo encoding será mantido.

    A plataforma de desenvolvimento .NET (e por consequência o Silverlight) utilizam Unicode por padrão para minimizar problemas com conteúdo, globalização e localização.


    Atenciosamente,

    Kelps Leite de Sousa | MVP Silverlight
    blog: http://kelps.net
    twitter : http://twitter.com/kelps

    Não se esqueça de "marcar como resposta" o ítem que lhe ajudou.

    terça-feira, 29 de abril de 2014 18:55
    Moderador
  • Certo, eu já tinha lido sobre isso, e já tinha feito o teste alterando o formato da codificação ao salvar o meu arquivo .txt, porém como a aplicação é em Silverlight e eu uso serviço WCF, eu preciso contornar esse "problema" para que a aplicação consiga decodificar qualquer arquivo .txt que passar por ela.

    Hoje na chamada do meu arquivo eu faço dessa maneira:

    OpenFileDialog _openFileDialog = new OpenFileDialog();
    _openFileDialog.Filter = "Text Files (.txt)|*.txt|All Files (*.*)|*.*";
    _openFileDialog.Multiselect = false;
    
    ObservableCollection<decodificacaoArquivo> linhasArquivo = new ObservableCollection<decodificacaoArquivo>();
    
    bool? dialogResultado = _openFileDialog.ShowDialog();
    
    if (dialogResultado.HasValue && dialogResultado.Value)
    {
         AplicacaoWait(false);
    
         Stream fileStream = _openFileDialog.File.OpenRead();
         arquivoTextBox.Text = _openFileDialog.File.Name;
    
         StreamReader reader = new StreamReader(fileStream, Encoding.UTF8);
    
         listaLinhasArquivo = new List<arquivoBancoDeDados>();
    
         while (!reader.EndOfStream)
         {
              arquivoBancoDeDados arquivo = new arquivoBancoDeDados();
              decodificacaoArquivo decodificar = new decodificacaoArquivo();
              arquivo.linhaArquivo = reader.ReadLine();
    
              if (arquivo.linhaArquivo != "")
              {
                   numeroLinhas++;
                   listaLinhasArquivo.Add(arquivo);
                   decodificar.linhaArquivo = arquivo.linhaArquivo;
                   linhasArquivo.Add(decodificar);
              }
         }
         reader.Close();
    }

    Após ele ter feito isso, eu chamo o meu serviço, onde nele estou passando uma observable com tudo que tem no meu arquivo .txt:

    servicoWCF.converterArquivoCompleted += new EventHandler<converterArquivoCompletedEventArgs>(servicoWCF_converterArquivoCompleted);
    servicoWCF.converterArquivoAsync(linhasArquivo);

    O conteúdo que chega no meu serviço, se ele tiver algum carácter com acentuação, ele chega dessa maneira: Ex: "Testando conte�do para importa��o!"

    e no meu serviço, eu estou fazendo a decodificação dos caracteres que estão como "símbolos" no meu arquivo .txt, meu serviço está montado assim:

    public ObservableCollection<decodificacaoArquivo> converterArquivo(ObservableCollection<decodificacaoArquivo> arquivo)
            {
                try
                {
                    string unicodeString = "";
    
                    // Create two different encodings.
                    Encoding utf8 = Encoding.UTF8;
                    Encoding encodingDefault = Encoding.Default;
    
                    decodificacaoArquivo decodificaArquivo = new decodificacaoArquivo();
                    var _observableAUX = new ObservableCollection<decodificacaoArquivo>();
    
                    foreach (var item in arquivo)
                    {
                        // Convert the string into a byte[].
                        byte[] unicodeBytes = utf8.GetBytes(item.linhaArquivo);
    
                        // Perform the conversion from one encoding to the other.
                        byte[] utf8Bytes = Encoding.Convert(utf8, encodingDefault, unicodeBytes);
    
                        char[] utf8Chars = new char[encodingDefault.GetCharCount(utf8Bytes, 0, utf8Bytes.Length)];
                        encodingDefault.GetChars(utf8Bytes, 0, utf8Bytes.Length, utf8Chars, 0);
                        string utf8String = new string(utf8Chars);
    
                        decodificaArquivo.linhaArquivo = utf8String;
    
                        _observableAUX.Add(decodificaArquivo);
                    }
    
                    return _observableAUX;
                }
                catch (Exception ex)
                {
                    return null;
                }
            }

    Após ele ter passado no meu serviço, a frase convertida fica assim: Ex: "Testando conte?do para importa??o!".

    Será que há alguma maneira, de eu passar pro meu serviço o meu stream, ou há algum outro jeito de fazer para que eu consiga fazer a decodificação e o arquivo ser lido corretamente !?

    Desde já agradeço.

    Att.


    sexta-feira, 16 de maio de 2014 12:28