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

Langage Java Discussion :

Ma String est-elle compatible Latin1 ?


Sujet :

Langage Java

  1. #21
    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
    Bonjour,


    Pour détecter l'encodage d'une série de byte issue d'un fichier, tout est décrit dans le post de cette page, avec l'utilisation de l'API de Mozilla :
    http://forums.sun.com/thread.jspa?th...rt=30&tstart=0


    Il suffit ensuite d'adapter un peu le code pour la seconde classe comme voici :
    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
    66
    67
     
     
    import java.io.BufferedInputStream;
    import java.io.ByteArrayInputStream;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
     
     
    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();
    	}
     
    }
    Et l'utilisation se fait de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    		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);
    "record", "offset" et "count" étant des variables issues du code où je l'utilise.

    J'ai en entrée un fichier contenant à la fois de l'EBCDIC (CP-500) et de l'ASCII, et il me faut les détecter pour convertir en ASCII l'EBCDIC (et pas les données déjà convertie). Ca marche impect, il me détecte très bien la partie ASCII.

    (J'ai vu que cette question est posée à plusieurs endroit, peut-être serait-il judicieux d'en faire un article dans la FAQ puisque ce genre de question / réponse ne s'y trouve pas et complèterait très bien les parties de la FAQ citée plus haut)

    Cdlt.

  2. #22
    Expert éminent sénior

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Points : 79 915
    Points
    79 915
    Par défaut Merci
    Bonjour,

    Pardon de réouvrir le post mais je me devais de vous dire merci car cette réponse à résolu mon problème et Dieu sait comme on peut chercher dans le vague longtemps...




    Citation Envoyé par Tommy31 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    		CharsetEncoder iso8859Encoder = Charset.forName("iso-8859-1")
    				.newEncoder();
    		CharsetEncoder utf8Encoder = Charset.forName("UTF-8").newEncoder();
     
    		String s = "éàü";
     
    		String utf8S = new String(utf8Encoder.encode(
    				CharBuffer.wrap(s.toCharArray())).array());
     
    		System.out.println(utf8S);
     
    		System.out.println(iso8859Encoder.canEncode(utf8S));

  3. #23
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 11
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par adiGuba Voir le message

    Maintenant si tu fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	String str = "1€";
     
    	CharsetEncoder encoder = Charset.forName("iso-8859-1").newEncoder();
    	boolean ok = encoder.canEncode(str);
    Tu obtiendras un joli "false" car le caractère "€" n'est pas représentable dans iso-8859-1...


    a++
    En effet c'est ce qui se produit, cependant là est mon problème.

    Je me permet de ré-ouvrir le sujet après avoir parcouru le forum. Je cherche à envoyer un chaîne via ServletOutputStream, cependant un des caractère envoyé est un €, j'ai donc une exception qui apparaît :
    java.io.CharConversionException: € n'est pas un caractère ISO 8859-1

    J'ai fait en sorte que l'encodage soit en UTF-8.
    response.setCharacterEncoding("UTF-8");
    ServletOutputStream out = response.getOutputStream();

    Comment puis-je traiter ces caractères spéciaux ? (le € n'est qu'un exemple)

  4. #24
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 566
    Points : 21 635
    Points
    21 635
    Par défaut
    Fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Writer out = response.getWriter();
    ne passe pas par ServletOutputStream. Ses méthodes print() ne savent pas gérer le charset.
    De manière générale, pour écrire du texte on passe par un Writer.
    Les OutputStream servent à écrire des octets, du binaire, pas du texte.

  5. #25
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 11
    Points : 13
    Points
    13
    Par défaut
    J'ai essayer de remplacer par un Writer :
    PrintWriter out = response.getWriter();

    Puis la méthode write(String), je n'ai plus l'exception, donc il imprime l'ensemble des donnée, mais je perd l'affichage correct de tout les caractères spéciaux (tel que les "é").

  6. #26
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 566
    Points : 21 635
    Points
    21 635
    Par défaut
    C'est parce qu'avec ta méthode précédente, tu envoyais de l'iso-8859-1.

    Si elle marchait bien sauf avec les accents mais pas € par exemple, ça signifie que tes applications s'attendent à lire du iso-8859-1, pas de l'utf-8. Si tu leur envoies de l'utf-8, elles sont paumées.

    Solution : envoie en windows-1252 au lieu d'utf-8 ou iso-8859-1.
    Ça ne pourra pas envoyer de tout comme on le peut avec utf-8, mais ça pourra envoyer des € et des œ, ce qui est probablement ce que tu veux. De plus, pour les caractères chinois ou ce genre de chose, ça ne fera pas d'exception, ça les remplacera par un ?

  7. #27
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 11
    Points : 13
    Points
    13
    Par défaut
    Tout d'abord, merci pour ton aide. La solution que tu propose règle bien le problème.

    Cependant je souhaiterai aller plus loin, d'après toi, le problème viens du fait que mon application s'attends à lire du iso-8859-1, pas de l'utf-8.

    Comment puis-je faire en sorte que mes applications attendent de l'UTF-8 ?

  8. #28
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 566
    Points : 21 635
    Points
    21 635
    Par défaut
    Citation Envoyé par pooum Voir le message
    Comment puis-je faire en sorte que mes applications attendent de l'UTF-8 ?
    C'est leur problème. Tout dépend quel genre d'applications c'est, et en quel langage elles sont.
    Apparemment, ta servlet leur annonçait que tu transmettais de l'utf-8, mais elles s'en foutaient complètement et le lisaient comme du iso-8859-1. Ça a l'air d'un environnement un peu particulier, je ne peux pas deviner de quoi il s'agit.

  9. #29
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 11
    Points : 13
    Points
    13
    Par défaut
    OK je vois, dans le cas présent je génère un fichier excel... donc ce n'est pas moi qui ai la main.

    Encore une fois merci pour tes conseils judicieux.

  10. #30
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 566
    Points : 21 635
    Points
    21 635
    Par défaut
    Excel ? Des fichiers textes ?
    Je vais supposer que tu veux dire des fichiers CSV ou XML compatibles Excel...

  11. #31
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 11
    Points : 13
    Points
    13
    Par défaut
    Je n'ai pas parlé de fichier texte, mais en effet il s'agit de CSV compatible excel.

Discussions similaires

  1. Ma configuration est-elle compatible
    Par Roitiflamme dans le forum Windows 8
    Réponses: 4
    Dernier message: 07/01/2013, 20h37
  2. "string" est-elle de type char*
    Par yessine66 dans le forum C
    Réponses: 2
    Dernier message: 30/09/2010, 18h33
  3. Réponses: 6
    Dernier message: 31/10/2006, 10h55
  4. Réponses: 7
    Dernier message: 11/09/2006, 16h44
  5. La fonction fgets est-elle compatible Windows/Unix ?
    Par ashurai dans le forum Langage
    Réponses: 1
    Dernier message: 05/04/2006, 17h59

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