Détecter l'encodage d'un fichier texte

Aller en bas

Détecter l'encodage d'un fichier texte Empty Détecter l'encodage d'un fichier texte

Message  Gus le Mer 22 Sep - 7:01

Voici une entité pour détecter l'objet Charset qui permettra de lire correctement le contenu texte d'un fichier.

gus.charset.findcharset.txtfile

Code:
package gus05.entity.gus.charset.findcharset.txtfile;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.nio.ByteBuffer;
import java.nio.charset.CharacterCodingException;
import java.nio.charset.Charset;
import java.nio.charset.CharsetDecoder;
import java.util.Iterator;
import java.util.Map;
import gus05.framework.core.Entity;
import gus05.framework.features.Transform;

public class FindCharsetTxtFile implements Entity, Transform {

    public String getName()         {return "gus.charset.findcharset.txtfile";}
    public String getCreationDate()      {return "2010.09.21";}

    public static final Charset[] CHARSETS = new Charset[]{
       Charset.forName("windows-1252"),
       Charset.forName("UTF-8"),
       Charset.forName("ISO-2022-JP"),
       Charset.forName("UTF-16"),
       Charset.forName("UTF-32"),
       Charset.forName("EUC-JP"),
       Charset.forName("ISO-8859-1"),
       Charset.forName("UTF-7"),
       Charset.forName("Shift_JIS"),
    };

    public Object transform(Object obj) throws Exception
    {
       File file = (File) obj;
       if(file.length()==0) return Charset.defaultCharset();
       
       if(detectCharset(file,Charset.defaultCharset()))
          return Charset.defaultCharset();
       
        for(int i=0;i<CHARSETS.length;i++)
       if(detectCharset(file,CHARSETS[i])) return CHARSETS[i];
       
        Map m = Charset.availableCharsets();
       Iterator it = m.keySet().iterator();
       while(it.hasNext())
       {
          Object key = it.next();
          Charset c = (Charset) m.get(key);
          if(detectCharset(file,c)) return c;
       }
        return null;
    }
   
    private boolean detectCharset(File f, Charset charset)
    {
        try
        {
           FileInputStream fis = new FileInputStream(f);
            BufferedInputStream input = new BufferedInputStream(fis);

            CharsetDecoder decoder = charset.newDecoder();
           
            byte[] buffer = new byte[512];
            boolean b = false;
            while((input.read(buffer)!=-1) && !b)
            {b = identify(buffer,decoder);}
            input.close();
            return b;
        }
        catch(Exception e)
        {return false;}
    }
   
    private boolean identify(byte[] bytes, CharsetDecoder decoder)
    {
        try{decoder.decode(ByteBuffer.wrap(bytes));}
        catch(CharacterCodingException e)
        {return false;}
        return true;
    }
}
Gus
Gus
Admin

Messages : 249
Date d'inscription : 01/09/2009

Voir le profil de l'utilisateur http://www.gus05.com

Revenir en haut Aller en bas

Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum