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

Entrée/Sortie Java Discussion :

probleme de charset


Sujet :

Entrée/Sortie Java

  1. #1
    loig.noblet
    Invité(e)
    Par défaut probleme de charset
    Bonjour,
    Je suis en train de travailler sur une application recevant des mails, et les traitant ensuite (mon application cherche un numero precis dans un mail).
    Pour ce faire j'essaie de récupérer le texte , et lorsqu'il y a un probleme de codage de le décoder pour le mettre au meme format iso.

    Voici la classe qui s'occupe de l'analyse des Bodypart du message multipart :
    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
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
     
    public class MessageAnalyzer {
    	private BodyPart[] tableau;
    	private int index;
    	private String texte="";
     
    	public static MessageAnalyzer analyze(Message msg){
    		MessageAnalyzer retour = new MessageAnalyzer();
    		try {
    			StringTokenizer tempo = new StringTokenizer(msg.getContentType(),"/");
    			String contenu=tempo.nextToken();
    			if ("text".equals(contenu))// si le contenu du mail est du texte simple
    			{
    				retour.texte = (String)msg.getContent();
    				retour.index=0;
    			}
    			else if ("multipart".equals(contenu))//si message multipart
    			{
    				Multipart messageMultipart = (Multipart)msg.getContent();
    				retour.tableau = new BodyPart[messageMultipart.getCount()];
    				for(int j=0;j<messageMultipart.getCount();j++)
    				{
    					retour.tableau[j] = messageMultipart.getBodyPart(j);
    					System.out.println("valeur du contenu du BodyPart : "+retour.tableau[j].getContentType());
    					System.out.println("valeur de la classe de msg :"+msg.getContentType());
    					System.out.println("texte : valeur de contenu : "+contenu);
    					System.out.println("multipart : valeur du contenu du BodyPart : "+retour.tableau[j].getContentType());
    					if("text/plain".equals(retour.tableau[j].getContentType()))// si c'est un text
    					{
    						retour.index = j;
    					}
    					else if("text/hmtl".equals(retour.tableau[j].getContentType()))// si c'est un text
    					{
    						retour.index = j;
    					}
    					else retour.index=-1;//sinon je met l'index a -1
     
    				}		
    			}
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (MessagingException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}catch (Exception e){
    			System.out.println("erreur inconnue : ");
    			e.printStackTrace();
    		}
    		return retour;
    	}
     
    	private MessageAnalyzer(){
    	}
     
    	public int getIndex() {
    		return index;
    	}
     
    	public void setIndex(int index) {
    		this.index = index;
    	}
     
    	public BodyPart[] getTableau() {
    		return this.tableau;
    	}
    	private static String decodeText(final String text) throws UnsupportedEncodingException {
     
            return null == text ? text : new String(text.getBytes("iso-8859-1"));
        }
     
    	public String getTextAt(int i){ //utilisé pour recuperer le texte à situé a index
    		String back = null;
    		if(!"".equals(this.texte)&&i==0) return texte;//si le String texte n'est pas vide et si l'index est a 0
    		try 
    		{
    			back = (String) this.tableau[i].getContent();
    			return back;//je recupere le contenu du texte
    		}catch(UnsupportedEncodingException e)//en cas d'exception
    		{
    			try
    			{
    				back= MessageAnalyzer.decodeText((String) this.tableau[i].getContent());//j'essaie de decoder le texte
    			} catch (UnsupportedEncodingException e1) {//et je retombe sur cette erreur pour les autres types de charset
    				System.out.println("défaut de codage du texte");
    				e1.printStackTrace();
    			} catch (IOException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			} catch (MessagingException e1) {
    				// TODO Auto-generated catch block
    				e1.printStackTrace();
    			}
     
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch (MessagingException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		} catch(Exception e){
    			System.out.println("impossible de récuperer le texte @ : "+i);
    			e.printStackTrace();
    		}
    		return "impossible de récuperer le texte @ : "+i;
    	}
    et voici l'erreur
    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
     
    1/03/2007 18:33:55.375 : INFO  : MessageAnalyzer.class : FIN de l'analyse du message
    défaut de codage du texte
    java.io.UnsupportedEncodingException: iso-9724-9 //j'ai pas mal d'autres types d'ISO
    	at sun.io.Converters.getConverterClass(Unknown Source)
    	at sun.io.Converters.newConverter(Unknown Source)
    	at sun.io.ByteToCharConverter.getConverter(Unknown Source)
    	at sun.nio.cs.StreamDecoder$ConverterSD.<init>(Unknown Source)
    	at sun.nio.cs.StreamDecoder$ConverterSD.<init>(Unknown Source)
    	at sun.nio.cs.StreamDecoder.forInputStreamReader(Unknown Source)
    	at java.io.InputStreamReader.<init>(Unknown Source)
    	at com.sun.mail.handlers.text_plain.getContent(text_plain.java:82)
    	at javax.activation.DataSourceDataContentHandler.getContent(DataHandler.java:789)
    	at javax.activation.DataHandler.getContent(DataHandler.java:536)
    	at javax.mail.internet.MimeBodyPart.getContent(MimeBodyPart.java:629)
    	at com.orange.sce.appli.impl.MessageAnalyzer.getTextAt(MessageAnalyzer.java:95)
    	at com.orange.sce.appli.impl.MailMessage.<init>(MailMessage.java:112)
    	at com.orange.sce.appli.impl.MailReceiver.getMessages(MailReceiver.java:109)
    	at com.orange.sce.presentation.Reception.<init>(Reception.java:78)
    	at com.orange.sce.presentation.Interface$2.actionPerformed(Interface.java:501)
    	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    Si quelqu'un a une idée je suis preneur parce que la je sais plus faire..

  2. #2
    loig.noblet
    Invité(e)
    Par défaut
    personne n'a une idée?

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2006
    Messages
    258
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 258
    Par défaut
    il faut ecrire en majuscule... ISO-8859-1

  4. #4
    loig.noblet
    Invité(e)
    Par défaut
    je viens d'essayer, ca ne fonctionne toujours pas..
    je bosse dessus toute la journée je vous tiens au courant

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 17
    Par défaut
    Je pense que mon problème est très similaire au tien: mon appli récupère le code source d'une page internet, et extrait des morceaux choisis pour les stocker dans un fichier XML.

    Le problème vient du fait que le code source récupéré est déjà mal codé: il contient déjà des &#39, des &eacute et autres joyeusetés.
    Du coup, un "new String(text.getBytes("iso-8859-1"));" est inutile.

    Et non, je n'ai pas la solution. Je planche aussi dessus...

  6. #6
    loig.noblet
    Invité(e)
    Par défaut
    Je n'ai toujours pas reussi a recuperer correctement les mails.. ce qui est bizzarre c'est que ca fonctionne parfaitement avec un logiciel de messagerie classique, ce n'est pas du chinois ou autre langage pas comme notre alphabet.

    Je planche aussi tiens moi au courant de l'evolution

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Février 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 17
    Par défaut
    En m'inspirant de cette page, j'ai développé une petite méthode. C'est de la bidouille pure, mais ça devrait suffire à nous débloquer.

    Il manque plus que certainement des caractères. Les tableaux ne sont pas exhaustifs...
    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
    	private static String conversion (String s)  {
    		String [] caractereSpecial = {
    				"é", "è", "à ",
    				"&eacute;", "&egrave;", "&euml;", "&agrave;", "&acirc;",
    				"&ucirc;", "&ugrave;", "&ecirc;", "&icirc;", "&ocirc;",
    				"&ccedil;", "&iuml;", "&trade;", "&copy;",
    				"&Eacute;", "&Egrave;", "&Euml;", "&Agrave;", "&Acirc;",
    				"&Ucirc;", "&Ugrave;", "&Ecirc;", "&Icirc;", "&Ocirc;",
    				"&Ccedil;", "&Iuml;", "&reg;", "&euro;",
    				"&nbspc;", "&#39",
    				};
    		String [] equivalent = {
    				"é", "è", "à",
    				"é", "è", "ë", "à", "â",
    				"û", "ù", "ê", "î", "ô",
    				"ç", "ï", "™", "©",
    				"É", "È", "Ë", "À", "Â",
    				"Û", "Ù", "Ê", "Î", "Ô",
    				"Ç", "Ï", "®", "€",
    				" ", "'"
    		};
    		int length = caractereSpecial.length;
    		for (int i=0; i<length; i++) {
    			s = s.replaceAll(caractereSpecial[i], equivalent[i]);
    		}
    		return s;
    	}

Discussions similaires

  1. probleme de charset sur JSP multilangue
    Par pcouas dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 20/11/2008, 22h56
  2. Probleme de charset
    Par tom7777 dans le forum Langage
    Réponses: 7
    Dernier message: 02/09/2008, 04h45
  3. probleme de charset
    Par beber* dans le forum Servlets/JSP
    Réponses: 24
    Dernier message: 07/07/2008, 09h14
  4. [UTF8] probleme de charset
    Par max44410 dans le forum Langage
    Réponses: 1
    Dernier message: 03/12/2007, 10h13
  5. [MySQL] Problème de charset avant l'envoi dans la BDD
    Par Death83 dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 29/08/2006, 18h51

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