none
como saber en que codificacion esta un archivo txt?

    Pregunta

  • 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?
    lunes, 09 de mayo de 2011 9:20

Respuestas

  • 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
    lunes, 09 de mayo de 2011 11:43
  • 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;
    }

    miércoles, 11 de mayo de 2011 11:28

Todas las respuestas

  • 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
    lunes, 09 de mayo de 2011 11:43
  •  

    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

     

    lunes, 09 de mayo de 2011 14:25
  • 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?

    miércoles, 11 de mayo de 2011 9:44
  • 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;
    }

    miércoles, 11 de mayo de 2011 11:28