null && bytes.Length >= 2) { //verifica esses primeiro pois utf32 pode confundir-se com utf16 if (bytes[0] == 0xff && bytes[1] == 0xfe && bytes[2] == 0 && bytes[3] == 0) return Encoding.UTF32; //utf-32BE Unicode (UTF-32 Big-Endian) if (bytes[0] == 0 && bytes[1] == 0 && bytes[2] == 0xfe && bytes[3] == 0xff) return Encoding.GetEncoding(12001); if (bytes[0] == 255 && bytes[1] == 254) return Encoding.Unicode; if (bytes[0] == 0xfe && bytes[1] == 0xff) return Encoding.BigEndianUnicode; if (bytes[0] == 239 && bytes[1] == 187 && bytes[2] == 191) return Encoding.UTF8; if (bytes[0] == 60 && bytes[1] == 63) return Encoding.ASCII; //reconhecimento de utf7 http://pt.wikipedia.org/wiki/Marca_de_ordem_de_byte if (bytes[0] == 43 && bytes[1] == 47 && bytes[2] == 118 && (bytes[3] == 56 || bytes[3] == 57 || bytes[3] == 43 || bytes[3] == 47)) return Encoding.UTF7; //uso da ferramenta UDE para detectar automaticamente o encoding try { //http://code.google.com/p/ude/ CharsetDetector d = new CharsetDetector(); d.Feed(bytes, 0, bytes.Length); d.DataEnd(); Encoding enc = Encoding.GetEncoding(d.Charset); d.Reset(); if (enc != null) return enc; else //por padrao retorna 1252, que e o iso 8859-1, ansi para europa ocidental, codepage padrao para windows em ingles e portugues //http://msdn.microsoft.com/en-us/library/system.text.encoding.codepage(v=vs.110).aspx //return Encoding.GetEncoding(1252); return Encoding.Default; } catch { //por padrao retorna 1252, que e o iso 8859-1, ansi para europa ocidental, codepage padrao para windows em ingles e portugues //http://msdn.microsoft.com/en-us/library/system.text.encoding.codepage(v=vs.110).aspx //return Encoding.GetEncoding(1252); return Encoding.Default; } } //por padrao retorna 1252, que e o iso 8859-1, ansi para europa ocidental, codepage padrao para windows em ingles e portugues //http://msdn.microsoft.com/en-us/library/system.text.encoding.codepage(v=vs.110).aspx //return Encoding.GetEncoding(1252); return Encoding.Default; } }}Antes de comecar os testes, abra o projeto do UDE. Voce vera que na linha 71 do arquivo UniversalDetector.cs existe um field protected chamado charsetProbers. Um array de Probers.protected CharsetProber[] charsetProbers = new CharsetProber[PROBERS_NUM];Va na classe CharsetDetector, arquivo CharsetDetector.cs, que e descendente de UniversalDetector e transforme esse field protegido em uma propertie somente leitura publica. Poderia ser um metodo Get tambem.public CharsetProber[] CharsetProbers { get { return this.charsetProbers; } }Isso fara com que a lista interna de CharsetProbers seja exposta, permitindo que voce navegue por ela. Um prober e uma classe interna da biblioteca responsavel por identificar um charset especifico. Quando voce cria a classe CharsetDetector e passa para ela um vetor de bytes para serem analisados ela cria varios probers para analisar o arquivo e nesse vetor ficam os probers usados, e a porcentagem de confiabilidade de cada um deles. Como existe um prober para cada encoding, o prober com maior confiabilidade sera o que providenciara a resposta final da biblioteca.Em um projeto real essa modificacao e totalmente desnecessaria. Foi incluida aqui apenas de curiosidade, para nossos testes. Outra modificacao e na biblioteca chardet. Ela sempre escreve o encoding detectado no console, mesmo que voce nao queira. E um processo interno de debug dela, mas atrapalha quando o teste e feito justamente em uma aplicacao console. Voce pode comentar a linha 255 do arquivo UniversalDetector.cs://Console.Out.WriteLine(aCharset);Comente tambem a linha 197 do arquivo SingleByteCharsetProber.cs://Console.Out.WriteLine(" SBCS: {0:0.000} [{1}]", GetConfidence(), CharSetName);Agora a biblioteca nao vai mais fazer um dump do seu processo interno de deteccao, mesmo em modo debug. A biblioteca UDE tambem tem essas