como saber en que codificacion esta un archivo txt?

Answered como saber en que codificacion esta un archivo txt?

  • Monday, May 09, 2011 9:20 AM
     
     
    Hola a tyodos, mi cuestioin es la siguiente, se supone que tengo que abrir cualquier tipo de archivo txt, pero, en caso de que se trate de codificacion ANSI o UniCode o quelauqier codificacion que no sea UTF-8 debo pasarlo a UTF-8 antes de abrirlo. Alguna sugerencia de como puedo identificar a priori en que codificacion esta escrito? y alguna sugerencia para la transformacion a UTF-8?

All Replies

  • Monday, May 09, 2011 11:43 AM
    Moderator
     
     Answered

    hola

    para conocer el encodign no has probado con


    StreamReader sr = new StreamReader("filename.txt", true);
    Encoding enc = fs.CurrentEncoding();
    con esto conocerias si es el encodigo que necesitas o no antes de abrirlo
    saludos

    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
  • Monday, May 09, 2011 2:25 PM
     
     

     

    StreamReader sr = new StreamReader("filename.txt", true);
    Encoding enc = fs.CurrentEncoding();
    con esto conocerias si es el encodigo que necesitas o no antes de abrirlo
    ...

    Extraido de tu enlace:

     

    The current character encoding used by the current reader. The value can be different after the first call to any Read method of StreamReader, since encoding autodetection is not done until the first call to a Read method.

    O sea que no tendrás la codificación en la propiedad CurrentEncoding del objeto sr, hasta que no hagas una llamada al metodo Read. 

    Pero esto es solo teoría, como bien indica Walter Miguel, no todos los formatos son reconocidos:

     

     It automatically recognizes UTF-8, little-endian Unicode, and big-endian Unicode text if the file starts with the appropriate byte order marks.

    http://msdn.microsoft.com/en-us/library/7bc2hwcb.aspx

     

  • Wednesday, May 11, 2011 9:44 AM
     
     

    Gracias a todos por vuestrea respuestas, seguí el consejo de Leandro, puse:

     

    StreamReader sr = new StreamReader(texto,true); //File.OpenText(texto);
                        cadena = sr.ReadLine();
                        Encoding enc = sr.CurrentEncoding;

     

    y al leer el Encoding enc me da lo siguiente:

     

    texto en ANSI -> UTF(Encoding, y claro esta, me lo representa mal(falta de letras acentuadas)

    el resto:

    texto en Unicode Big Endian -> UnicodeEncoding (lo representa bien)

    texto en Unicode -> UnicodeEncoding (lo representa bien)

    texto en UTF8 -> UTF8Encoding (lo representa bien)

     

    Por lo tanto el unico problema es con ANSI, como podria reconocer entonces que se trata de ANSI y pasarlo a por ejemplo Unicode o UTF8?

  • Wednesday, May 11, 2011 11:28 AM
     
     Answered Has Code

    Si el único problema lo tienes con el ANSI, que es precisamente el que no se puede reconocer porque carece de los bytes identificativos, entonces puedes seguir el acercamiento que siguen aquí:

     

    http://www.west-wind.com/weblog/posts/2007/Nov/28/Detecting-Text-Encoding-for-StreamReader

     

    Precisamente lo que hace es suponer que se trata de ANSI a no ser que "algo" le diga lo contrario:

    public static Encoding GetFileEncoding(string srcFile)
    {
      // *** Use Default of Encoding.Default (Ansi CodePage)
      Encoding enc = Encoding.Default;
     
      // *** Detect byte order mark if any - otherwise assume default
      byte[] buffer = new byte[5];
      FileStream file = new FileStream(srcFile, FileMode.Open);
      file.Read(buffer, 0, 5);
      file.Close();
     
      if (buffer[0] == 0xef && buffer[1] == 0xbb && buffer[2] == 0xbf)
        enc = Encoding.UTF8;
      else if (buffer[0] == 0xfe && buffer[1] == 0xff)
        enc = Encoding.Unicode;
      else if (buffer[0] == 0 && buffer[1] == 0 && buffer[2] == 0xfe && buffer[3] == 0xff)
        enc = Encoding.UTF32;
      else if (buffer[0] == 0x2b && buffer[1] == 0x2f && buffer[2] == 0x76)
        enc = Encoding.UTF7;
     
      return enc;
    }