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

Collection et Stream Java Discussion :

Map<String, String> static et accents


Sujet :

Collection et Stream Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Par défaut Map<String, String> static et accents
    Salut à tous,

    j'ai une Map static contenant des chaines de caractères :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public static Map<String, String> interpretationIMC = new LinkedHashMap<String, String>();
    	static{
    		interpretationIMC.put("moins de 16,5", "Dénutrition");
    		interpretationIMC.put("16,5 à 18,5", "Maigreur");
    		interpretationIMC.put("18,5 à 25", "Corpulence normale");
    		interpretationIMC.put("25 à 30", "Surpoids");
    		interpretationIMC.put("30 à 35", "Obésité modérée");
    		interpretationIMC.put("35 à 40", "Obésité sévère");
    		interpretationIMC.put("plus de 40", "Obésité massive");
    	}
    quand je l'ai sous cette forme et que je teste le getter qui me la renvoie, le test ne passe pas à cause des accents :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	@Test
    	public void testGetinterpretationAttendu() {
    		Map<String, String> interpretationAttendu = new HashMap<String, String>();
    		interpretationAttendu.put("moins de 16,5", "Dénutrition");
    		interpretationAttendu.put("16,5 à 18,5", "Maigreur");
    		interpretationAttendu.put("18,5 à 25", "Corpulence normale");
    		interpretationAttendu.put("25 à 30", "Surpoids");
    		interpretationAttendu.put("30 à 35", "Obésité modérée");
    		interpretationAttendu.put("35 à 40", "Obésité sévère");
    		interpretationAttendu.put("plus de 40", "Obésité massive");
     
    		assertEquals(interpretationAttendu, bilan.getInterpretationIMC());
    	}
    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
    java.lang.AssertionError: expected:<{25 à 30=Surpoids, 30 à 35=Obésité modérée, 16,5 à 18,5=Maigreur, 35 à 40=Obésité sévère, moins de 16,5=Dénutrition, plus de 40=Obésité massive, 18,5 à 25=Corpulence normale}> but was:<{moins de 16,5=D�nutrition, 16,518,5=Maigreur, 18,525=Corpulence normale, 2530=Surpoids, 3035=Ob�sit� mod�r�e, 3540=Ob�sit� s�v�re, plus de 40=Ob�sit� massive}>
    	at org.junit.Assert.fail(Assert.java:91)
    	at org.junit.Assert.failNotEquals(Assert.java:645)
    	at org.junit.Assert.assertEquals(Assert.java:126)
    	at org.junit.Assert.assertEquals(Assert.java:145)
    	at fr.statlife.bilanNutrition.TestBilanNutrition.testGetinterpretationAttendu(TestBilanNutrition.java:173)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:597)
    	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
    	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    	at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
    	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
    Maintenant, si dans mon getter je n'utilise plus ma Map static, mais que j'en instancie une nouvelle (exactement la même, mais pas static cette fois):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	@Override
    	public Map<String, String> getInterpretationIMC() {
    		Map<String, String> interpretationIMC = new LinkedHashMap<String, String>();
    		interpretationIMC.put("moins de 16,5", "Dénutrition");
    		interpretationIMC.put("16,5 à 18,5", "Maigreur");
    		interpretationIMC.put("18,5 à 25", "Corpulence normale");
    		interpretationIMC.put("25 à 30", "Surpoids");
    		interpretationIMC.put("30 à 35", "Obésité modérée");
    		interpretationIMC.put("35 à 40", "Obésité sévère");
    		interpretationIMC.put("plus de 40", "Obésité massive");
    		return interpretationIMC;
    		//return Coefficient.interpretationIMC;
    	}
    Le test passe sans le moindre problème.

    Alors bon, dans l'absolue je peux utiliser cette deuxième méthode pour ne pas avoir de problème, mais si quelqu'un peut m'expliquer le pourquoi du comment, ça serait chouette, car je comprends pas du tout pourquoi les accents passent pas quand la Map est static...
    Merci d'avance !

    EDIT : dans la fenêtre de code de dvp, on voit que les accents sont transformé dans un autre encodage... Reste à savoir pourquoi...

  2. #2
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Bonjour,

    Je ne sais pas d'où vient votre erreur, mais cela fonction parfaitement chez moi :
    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
    import java.util.HashMap;
    import java.util.LinkedHashMap;
    import java.util.Map;
    import static org.junit.Assert.*;
    import org.junit.Test;
     
    public class testcase {
    	public static Map<String, String> interpretationIMC = new LinkedHashMap<String, String>();
    	static{
    		interpretationIMC.put("moins de 16,5", "Dénutrition");
    		interpretationIMC.put("16,5 à 18,5", "Maigreur");
    		interpretationIMC.put("18,5 à 25", "Corpulence normale");
    		interpretationIMC.put("25 à 30", "Surpoids");
    		interpretationIMC.put("30 à 35", "Obésité modérée");
    		interpretationIMC.put("35 à 40", "Obésité sévère");
    		interpretationIMC.put("plus de 40", "Obésité massive");
    	}
     
    	@Test
    	public void testGetinterpretationAttendu() {
    		Map<String, String> interpretationAttendu = new HashMap<String, String>();
    		interpretationAttendu.put("moins de 16,5", "Dénutrition");
    		interpretationAttendu.put("16,5 à 18,5", "Maigreur");
    		interpretationAttendu.put("18,5 à 25", "Corpulence normale");
    		interpretationAttendu.put("25 à 30", "Surpoids");
    		interpretationAttendu.put("30 à 35", "Obésité modérée");
    		interpretationAttendu.put("35 à 40", "Obésité sévère");
    		interpretationAttendu.put("plus de 40", "Obésité massive");
    		assertEquals(interpretationIMC, interpretationAttendu);
    		for (String key : interpretationAttendu.keySet()) {
    			assertTrue(interpretationIMC.containsKey(key));
    			assertEquals(interpretationAttendu.get(key), interpretationIMC.get(key));
    		}
    	}
    }
    Notez que j'ai testé avec JUnit4.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  3. #3
    Membre éclairé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Par défaut
    je teste aussi avec JUnit 4, donc la différence ne doit pas venir de là. Du coup, la seule différence que je vois c'est le fait de passer par une fonction pour récupérer la Map...

    et pour continuer dans les trucs qui vont pas, cette Map fait partie d'une petite lib que j'utilise en jar externe dans un autre projet.
    Et que ce soit avec la version de la Map static ou non static, les accents sont encodés différemment quand j'utilise la Map dans l'autre projet.
    Est ce qu'il peut y avoir des problèmes d'encodage quand on passe un projet en jar et qu'on l'utilise dans un autre projet?
    Peut-être y'a-t-il des réglages à faire au niveau de Maven ou d'Eclipse?

    J'avoue que si je pouvais éviter d'avoir à retraduire l'ensemble des caractères accentués des chaines de caractère provenant de ma lib externe, ça m'arrangerait

  4. #4
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par zaboug Voir le message
    EDIT : dans la fenêtre de code de dvp, on voit que les accents sont transformé dans un autre encodage... Reste à savoir pourquoi...
    Reposte ton message d'erreur, mais dans des balises [ CODE=x ] [ /CODE ] et non pas [ CODE ] [ /CODE ]




    A vue de nez ton problème c'est probablement que le compilateur a lu ton fichier source avec un encodage différent de celui qui a servi à créer le fichier. Faut rester cohérent entre tes éditeur et le codage que tu demande à javac d'utiliser pour lire le fichier.
    Maitnenat, reste à savoir qui de ton projet externe ou de ton unit test a commis une erreur :p

    On peux pas se fier à la console car en termes d'encodage, souvent deux erreur cumulée (1 erreur compilation + 1 erreur configuration console) peuvent se neutraliser

  5. #5
    Membre éclairé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Par défaut
    voici le message d'erreur avec les jolies point d'interrogations blanc sur fonc noir
    Code x : 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
    java.lang.AssertionError: expected:<{25 � 30=Surpoids, 35 � 40=Ob�sit� s�v�re, 18,5 � 25=Corpulence normale, 16,5 � 18,5=Maigreur, moins de 16,5=D�nutrition, plus de 40=Ob�sit� massive, 30 � 35=Ob�sit� mod�r�e}> but was:<{moins de 16,5=Dénutrition, 16,5 à 18,5=Maigreur, 18,5 à 25=Corpulence normale, 25 à 30=Surpoids, 30 à 35=Obésité modérée, 35 à 40=Obésité sévère, plus de 40=Obésité massive}>
    	at org.junit.Assert.fail(Assert.java:91)
    	at org.junit.Assert.failNotEquals(Assert.java:645)
    	at org.junit.Assert.assertEquals(Assert.java:126)
    	at org.junit.Assert.assertEquals(Assert.java:145)
    	at fr.statlife.bilanNutrition.TestBilanNutrition.testGetinterpretationAttendu(TestBilanNutrition.java:173)
    	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    	at java.lang.reflect.Method.invoke(Method.java:597)
    	at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
    	at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
    	at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
    	at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
    	at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28)
    	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
    	at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
    	at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
    	at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
    	at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
    	at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
    	at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
    	at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
    	at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
    	at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
    	at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

    alors par contre, truc très bizarre : maintenant, c'est quand j'utilise la Map static que les tests passent, et pas quand j'utilise celle instancié dans la méthode...
    Je sais pas pourquoi ce revirement de situation, mais visiblement lors du test les caractères accentués sont encodés de la même manière bizarre qu'avec la Map static... donc le test passe puisque les deux utilise le même encodage

    Maintenant, pour trouver qui encode différemment des autres... arf, je sens que ça va être prise de tête !
    Mes deux projets sont dans le même workspace d'eclipse.
    Par contre, la génération du jar se fait avec Maven via un mvn clean install, donc Maven recompile le tout pour générer le jar...
    reste à savoir quel encodage utilise Maven et quel encodage utilise Eclipse si j'ai bien compris...

  6. #6
    Membre éclairé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Par défaut
    c'est bon, c'est du côté d'Eclipse que les sources java étaient pas en UTF-8 par défaut. Du coup, maintenant que c'est passé en utf-8, je vais pouvoir m'amuser à aller à la chasse aux points d'interrogations qui sont apparus partout dans mes 63 classes .

    Mais au moins, après ça sera propre de partout, et y'aura plus de problème.
    Merci à vous deux pour votre aide

  7. #7
    Modérateur
    Avatar de kolodz
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    2 209
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 209
    Billets dans le blog
    52
    Par défaut
    Si je ne me trompe pas vous pouvez utiliser notepad++ pour changer l'encodage d'un fichier texte.
    Si vos classes sont trop impacté pour être fixé manuellement, cela peut vous aider.

    Cordialement,
    Patrick Kolodziejczyk.
    Si une réponse vous a été utile pensez à
    Si vous avez eu la réponse à votre question, marquez votre discussion
    Pensez aux FAQs et aux tutoriels et cours.

  8. #8
    Membre éclairé
    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    379
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 379
    Par défaut
    en fait, Eclipse change automatiquement l'encodage des pages quand on le précise dans les préférences. C'est juste que du coup tous les accents deviennent des points d'interrogations et qu'il faut repasser partout pour faire les changements...
    Un peu fastidieux, mais pas insurmontable

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

Discussions similaires

  1. string functions(détecter lettres avec accents)
    Par patburn_911 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 20/02/2013, 10h22
  2. Recuperation d'un map <string,string> au lieu d'un list
    Par sallemel dans le forum Hibernate
    Réponses: 2
    Dernier message: 25/02/2011, 00h56
  3. vector<map<string, string> >::iterator ?
    Par scheme dans le forum C++
    Réponses: 11
    Dernier message: 10/12/2010, 09h32
  4. @CollectionOfElements Map<String, String>
    Par Hammer dans le forum Hibernate
    Réponses: 1
    Dernier message: 15/04/2010, 20h27
  5. Réponses: 5
    Dernier message: 02/09/2005, 07h46

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