IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

API standards et tierces Java Discussion :

[Encoding] Détection encodage d'une String


Sujet :

API standards et tierces Java

  1. #1
    kij
    kij est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Points : 157
    Points
    157
    Par défaut [Encoding] Détection encodage d'une String
    Bonjour,

    Je viens à vous pour vous demander conseil : j'aimerai dans l'un de mes programmes (java), détecter l'encodage d'une chaine de caractère (utf-8 en l'occurrence).
    J'essaie de trouver sur le net quelque chose mais sans grand résultat pour le moment, est-ce que quelqun en sait suffisamment sur le sujet pour m'aider ?

    Pour l'instant je test l'utilisation de ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Charset clatin1 = Charset.forName("UTF-8");
    CharsetDecoder decoder = clatin1.newDecoder();
    Mais je n'arrive pas à détecter si une chaine en entrée est encodée en UTF-8 ou non.

    Merci à vous.

  2. #2
    Membre averti
    Inscrit en
    Octobre 2007
    Messages
    311
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 311
    Points : 318
    Points
    318
    Par défaut
    Salut,

    Voici une récente discussion qui pourrait t'intéresser pour ton problème : http://www.developpez.net/forums/sho...light=encodage

  3. #3
    kij
    kij est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Points : 157
    Points
    157
    Par défaut
    Re,

    Merci pour ton aide et pour le lien vers cette discussion pour le moins intéressante.
    Je n'ai pas pu corriger mon bug avec ceci comme je voulais, mais ça m'a permit d'y voir un peu plus clair pour ce qui est des encodages.

    Mon bug à résoudre n'ayant aucun rapport spécial avec la question je ne mettrais pas de réponse globale donc, mais si quelqun passe par là avec un problème d'encodage, qu'il suive le lien plus haut

    Merci encore DevTeam_.

  4. #4
    kij
    kij est déconnecté
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 362
    Points : 157
    Points
    157
    Par défaut
    Hello,

    Ayant trouvé récemment LA solution, je me permet de la poster ici, ce qui permettra de résoudre définitivement ce problème.

    Il faut utiliser (par exemple, c'est la solution que j'ai trouvé) l'API de mozilla qui permet de détecter l'encoding de données.

    Source où j'ai trouvé la chose : http://forums.sun.com/thread.jspa?th...rt=30&tstart=0

    Explications :

    Il faut tout d'abord télécharger le JAR de l'API en question pour l'inclure dans le classpath de votre projet, il est téléchargeable ici :
    http://www.findjar.com/jar/net.sourc...t-1.0.jar.html

    Ensuite, comme dans la discussion du premier lien donné, il vous faut créer deux classes dans le même package (plus facile pour l'utilisation, et comme leur fonctionnalité vont ensemble...).

    La première qui étendra l'interface 'nsICharsetDetectionObserver' de l'API mozilla :
    Code de 'CharsetInputObserver.java' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
     
    import org.apache.log4j.Logger;
    import org.mozilla.intl.chardet.nsICharsetDetectionObserver;
     
    public class CharsetInputObserver implements nsICharsetDetectionObserver {
     
    	static int READY=2;
    	static int RUNNING=1;
    	static int IDLE=0;
     
    	private int status = IDLE;
    	private String charsetToUse = "";
     
    	static Logger logger = Logger.getLogger(CharsetInputObserver.class);
     
    	public void Notify(String charset) {
     
    		logger.debug(" >> charset detected --> " + charset);
     
    		charsetToUse = charset;
    		status = READY;
    	}
     
    	public String getCharsetToUse() {
    		return charsetToUse;
    	}
     
    	public void setCharsetToUse(String charsetToUse) {
    		this.charsetToUse = charsetToUse;
    	}
     
    	public int getStatus() {
    		return status;
    	}
     
    	public void setStatus(int status) {
    		this.status = status;
    	}
    }
    La seconde, qui constitue la classe de traitement, à vous donc de la modifier selon vos besoins. En voici une implémentation générique pour récupérer l'encoding au format texte pour un tableau de byte donné :

    Code de 'CharsetInputHelper.java' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
     
    import java.io.BufferedInputStream;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
     
     
    import org.apache.log4j.Logger;
    import org.mozilla.intl.chardet.nsDetector;
    import org.mozilla.intl.chardet.nsPSMDetector;
     
    public class CharsetInputHelper {
     
    	Logger logger = Logger.getLogger(CharsetInputHelper.class);
     
    	private nsDetector det = null;
    	private CharsetInputObserver obsvr = null;
     
    	public CharsetInputHelper ( ){
     
    		int lang = nsPSMDetector.ALL; //or nsPSMDetector.JAPANESE and so. See Jchardet API for more information
     
    		det = new nsDetector(lang);
    		obsvr = new CharsetInputObserver();
     
    	}
     
    	public String whichEncodingIs ( byte[] theData ){
     
    		boolean isAscii = true ;
    		det.Init( obsvr );
     
    		try {
     
    			// Check if the stream is only ascii.
    			if (isAscii)
    				isAscii = det.isAscii(theData,theData.length);
     
    			// DoIt if non-ascii and not done yet.
    			// Here I've removed the && !done
    			//because I wanted to see all charsets encodings
    			//that Jchardet detects in a file
     
    			if (!isAscii)
    				det.DoIt(theData,theData.length, false);
     
     
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			System.err.println("[whichEncodingIs] Error : "+e.getMessage());
    			e.printStackTrace();
    			obsvr.setCharsetToUse("CP-500");
    		} finally {
    			det.DataEnd();
    		}
     
    		if (isAscii){
    			obsvr.setCharsetToUse("ASCII");
    		}
     
    		return obsvr.getCharsetToUse();
    	}
     
    }
    Enfin, l'utilisation de la seconde classe sur vos tableaux de byte au sein de votre code (un exemple issu de mon code) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    	byte[] theData = new byte[count];
    	System.arraycopy(record, offset, theData, 0, count);
     
    	CharsetInputHelper myHelper = new CharsetInputHelper();
    	String theEncoding = myHelper.whichEncodingIs(theData);
    	System.out.println("Encoding found = "+theEncoding);
    Voilà, vous savez tout

    ps: peut-être pourrait-on créé une question / réponse de plus dans la FAQ au bon endroit, cela me semble plutôt judicieux puisque le sujet de ce topic ne s'y trouve pas et me semble assez pertinent ?

  5. #5
    Membre à l'essai
    Profil pro
    Développeur Java
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Points : 17
    Points
    17
    Par défaut
    Bonjour à tous,

    je me permet d'ajouter une note ici car j'ai rencontré un problème similaire que je n'arrive pas à résoudre.


    J'ai lu divers sujets sur ce forum, mais aucun ne m'a fournit une solution adéquat.

    A chaque fois on parle de solutions qui permettent de trouver l'encodage à l'aide du BOM ou encore du charset (pour moi l'un est la conséquence de l'autre).

    Voici mon problème:

    J'utilise un batch java 6 (JDK1.6) avec base db2 v9.5.
    J'ai besoin de faire la différence entre les fichiers encodés en ISO-8859-15 et ceux encodés en UTF-8 sans BOM.

    Après quelques tests, il apparait que l'utilisation de jchardet-1.0.jar ne permet pas celà.

    Quelqu'un aurait-il une autre solution?

  6. #6
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 551
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Citation Envoyé par X-Wing Voir le message
    Après quelques tests, il apparait que l'utilisation de jchardet-1.0.jar ne permet pas celà.
    Si, c'est même son seul intérêt, mais :

    - C'est une impossibilité mathématique que de déterminer avec certitude le charset d'un texte dont on ne connaît pas le charset. Et jchardet ne pousse quand même pas l'intelligence artificielle trop loin. Bref, des erreurs peuvent arriver.
    C'est pour ça qu'on vous dit sans arrêt de déjà connaître l'encodage, ou de l'indiquer d'une quelconque manière à l'intérieur du texte à décoder : parce que ça, c'est fiable.

    - Il lui faut beaucoup d'octets à auto-détecter. Il faut qu'il ait l'occasion de tomber sur des accents, plusieurs fois de sorte que s'il y a des gribouillis ou des erreurs au début du texte, ça ne change pas la décision de l'auto-détection.

    - Du fait des maigres différences entre iso-8859-1 et iso-8859-15, un détecteur automatique ne fera pas la différence. C'est pas grave : si tu n'as que du iso-8859-15 ou de l'utf-8, et qu'on te détecte du iso-8859-1, tu n'as qu'à te dire qu'en fait, c'est iso-8859-15.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Encodage d'une String
    Par Seth77 dans le forum Général Dotnet
    Réponses: 4
    Dernier message: 12/06/2012, 18h41
  2. Problème d'encodage d'une string
    Par tabbabi dans le forum Android
    Réponses: 6
    Dernier message: 23/08/2011, 13h18
  3. Encodage d'une string XML
    Par benthebest dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 15/01/2010, 18h50
  4. encodage d'une string en XML
    Par maxvador dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 24/08/2006, 17h57
  5. Réponses: 3
    Dernier message: 01/08/2005, 12h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo