Le Deal du moment :
Les 10 jeux vidéo indispensables pour bien ...
Voir le deal

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

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