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

Java Discussion :

probleme pour lire accents avec un objet Scanner


Sujet :

Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2015
    Messages : 55
    Par défaut probleme pour lire accents avec un objet Scanner
    Bonjour,

    Je n'arrive pas à recuperer, depuis la console cmd, les caracteres accentués. par exemple si je rentre "é", il me dit qu'il a pris "?".

    Voici le type d'objet crée:
    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
    public class Mois
    {
    	public String nomMois;
    	public int numeroMois;
     
    	public void MiseAJourNom()
    	{
    		if (nomMois.equals("juin"))
    		{
    			nomMois = "JUIN";
    		}
    	}
     
    	public void MiseAJourNumero()
    	{
    		if (nomMois.equals("juin"))
    		{
    			System.out.println("Passe en A");
    			numeroMois = 6;
    		}
    		else
    			System.out.println("Passe en B");
     
    	}
     
    	public void MiseAJourAccents()
    	{
    	    nomMois = nomMois.replaceAll("è","e");
        	nomMois = nomMois.replaceAll("é","e");
    	    nomMois = nomMois.replaceAll("ê","e");
    	    nomMois = nomMois.replaceAll("ë","e");
    	    nomMois = nomMois.replaceAll("û","u");
    	    nomMois = nomMois.replaceAll("ù","u");
    	    nomMois = nomMois.replaceAll("ï","i");
    	    nomMois = nomMois.replaceAll("î","i");
    	    nomMois = nomMois.replaceAll("à","a");
    	    nomMois = nomMois.replaceAll("â","a");
    	}
     
    }
    et voici mon code principal:

    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
    import java.util.*;
    import java.text.Normalizer;
     
    public class MoisMots
    {
     
     
     
    	public static void main(String[] args) 
    	{
     
     
    	// declarer les varaibles mois,annee,jourDansMois, rajout de MoisMotsInitial
    		Mois moisDuProgramme = new Mois();
    		String MoisMots = new String();
    	// creer le scan
    		Scanner scanClavier = new Scanner(System.in,"UTF-8");
    	// demander la saisie du mois
    		System.out.println("Saisir un mois en lettres svp :");
    	// enregistrer la saisie
    		moisDuProgramme.nomMois = scanClavier.nextLine();
    		System.out.println("avant transfo le mois est :"+moisDuProgramme.nomMois);
    		moisDuProgramme.MiseAJourAccents();	
    		System.out.println("apres transfo le mois est :"+moisDuProgramme.nomMois);
    		moisDuProgramme.MiseAJourNumero();
     
    	}
    }
    Ca me donne:

    Saisir un mois en lettres svp :
    é
    avant transfo le mois est : ?
    apres transfo le mois est : ?

    Pourriez vous m'aider svp ?

    Merci
    Cedric

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Hello,

    Malheureusement, la console de Windows fait un peu n'importe quoi pour la gestion des accents, et Java n'a pas eu envie de faire des embrouilles pour s'y adapter. Résultat des courses, c'est pas impossible, mais assez compliqué de faire marcher les accents dans la console Windows avec un programme Java.

    Le mieux, c'est de ne pas essayer. Après tout, la gestion des accents c'est un truc un peu de fioriture et pas tellement de la technique de programmation, et si on veut des fioritures, on ne fait pas un programme en console de commande, on fait des fenêtres.

    Mais si tu veux insister, on va se pencher dessus.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2015
    Messages : 55
    Par défaut
    hello,

    Merci, je veux bien essayer d'aller au bout quand même, par défi personnel :-)

  4. #4
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2015
    Messages : 55
    Par défaut
    après avoir quasiment tout essayé des astuces trouvés sur le web, ca ne marche toujours pas :-)...si quelqu'un à une idée?

  5. #5
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Oui, oui, on va s'en occuper...

    Alors pour commencer ce UTF-8 dans new Scanner(System.in,"UTF-8"); ça va pas être possible. System.in et System.out, c'est les deux sens de la même console. Tu ne peux pas essayer de changer l'encodage de l'un sans toucher à l'encodage de l'autre.

    Alors on remplace par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Scanner scanClavier = new Scanner(System.in);
    et il va donc utiliser l'encodage par défaut, dans les deux sens.

    Parlons-en de cet encodage par défaut, on peut demander au programme de l'afficher. Ajoutons ceci au début du programme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println("Charset par défaut : " + Charset.defaultCharset());
    Maintenant, testons ça.

    Si je teste dans mon IDE, ça donne ça :

    Code résultat : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Charset par défaut : UTF-8
    Saisir un mois en lettres svp :
    Février
    avant transfo le mois est :Février
    apres transfo le mois est :Fevrier
    Passe en B

    UTF-8 ? Bon, ça c'est mon IDE qui cherche à me simplifier la vie... En tout cas tout fonctionne.

    Testons dans la console windows :

    Code résultat : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    D:\Java\sandbox\target\classes>java MoisMots
    Charset par défaut : windows-1252
    Saisir un mois en lettres svp :
    Février
    avant transfo le mois est :F?vrier
    apres transfo le mois est :F?vrier
    Passe en B

    Cette fois le charset par défaut c'est "windows-1252". Et mon "Février" n'est pas passé...

    Bon, parlons un peu des encodages.

    En gros, de notre côté de l'occident, il y a grosso-merdo 3 standards d'encodages de caractères qui sachent gérer les accents :

    - latin-1, standard ISO
    - codepage 1252, aussi appelé windows-1252, une extension de latin-1. C'est ce que Windows utilise presque partout sur les systèmes d'Europe de l'Ouest. Ces histoires de codepage c'est un truc à Microsoft.
    - utf-8, compatible Unicode, capable de représenter tous les caractères connus de l'informatique.

    Java quand il tourne sous Windows, sans surprise, utilise par défaut l'encodage que Windows utilise presque partout. Ailleurs que sous Windows, par contre, tout est passé à UTF-8.

    En tout cas, windows-1252 n'a pas l'air de bien s'entendre avec la console.

    On peut interroger quel encodage utilise la console, avec la commande chcp :

    Code résultat : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    D:\Java\sandbox\target\classes>chcp
    Page de codes active*: 850

    Un "codepage 850" donc. Et ça correspond à quoi ?... Eh ben, à aucun des trois. C'est un encodage d'IBM, qui fait son propre truc. Commençons donc par nous taper la tête sur le bureau.

    On a bien tapé ? Parfait. Une première chose à essayer, c'est de changer l'encodage de la console. C'est encore avec la commande chcp, mais en indiquant celui qu'on veut utiliser.

    Puisque notre programme semble vouloir utiliser le codepage 1252, allons-y :

    Code résultat : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    D:\Java\sandbox\target\classes>chcp 1252
    Page de codes active*: 1252

    Testons le programme à nouveau :

    Code résultat : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    D:\Java\sandbox\target\classes>java MoisMots
    Charset par défaut : windows-1252
    Saisir un mois en lettres svp :
    Février
    avant transfo le mois est :Février
    apres transfo le mois est :Fevrier
    Passe en B

    Ah ben c'est mieux !

    C'est une façon de faire. Il a juste fallu changer l'encodage de la console, ce qui a des chances d'affecter les autres programmes que le nôtre.

    Autre solution. Fermons déjà cette console pour annuler les changements, et ouvrons-en une autre. Testons à nouveau le programme : le problème est revenu.

    Une autre chose qu'on peut faire, c'est démarrer le programme en indiquant à Java que l'encodage par défaut, c'est le codepage 850. En cherchant un peu dans les encodages connus, on trouve qu'il faut faire comme ça :

    Code résultat : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    D:\Java\sandbox\target\classes>java -Dfile.encoding=IBM850 MoisMots
    Charset par défaut : IBM850
    Saisir un mois en lettres svp :
    Février
    avant transfo le mois est :Février
    apres transfo le mois est :Fevrier
    Passe en B

    Ça marche aussi, et cette fois sans changer la console.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2015
    Messages : 55
    Par défaut
    Merci bcp, je me rapproche mais j'y suis pas encore;-)

    J'ai donc changé le charset de la console en 1252. Ca m'affiche bien la saisie en tenant compte des accents.
    Par contre, lorsque '=j'applique la methode replaceAll("é",'"e") à moisDuProgramme.nomMois ca ne me change pas les "é" en "e"....

    Voici mon code
    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
    import java.util.*;
    import java.nio.charset.Charset;
    import java.text.Normalizer;
     
    public class MoisMots
    {
    	public static void main(String[] args) 
    	{
     
    	// declarer les varaibles mois,annee,jourDansMois, rajout de MoisMotsInitial
    		System.out.println("Charset par défaut : " + Charset.defaultCharset());
    		Mois moisDuProgramme = new Mois();
    		String MoisMots = new String();
     
    	// creer le scan
    		Scanner scanClavier = new Scanner(System.in);
     
    	// demander la saisie du mois
    		System.out.println("Saisir un mois en lettres svp :");
     
    	// enregistrer la saisie
    		moisDuProgramme.nomMois = scanClavier.nextLine().toLowerCase();
    		//System.out.println("Saisir une annee svp :");
     
    	// donner les resultats
    		System.out.println("avant transfo le mois est :"+moisDuProgramme.nomMois);	
    		moisDuProgramme.nomMois = moisDuProgramme.nomMois.replaceAll("é","e");
    		moisDuProgramme.nomMois = moisDuProgramme.nomMois.replaceAll("d","i");
    		System.out.println("aprestransfo le mois est :"+moisDuProgramme.nomMois);	
    	}
    }
    Ca me donne:

    C:\Users\CLV\Documents\Workspace>java MoisMots
    Charset par défaut : windows-1252
    Saisir un mois en lettres svp :
    décembRE
    avant transfo le mois est :décembre
    aprestransfo le mois est :iécembre

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2015
    Messages : 55
    Par défaut
    en fait j'ai rajouté un autre test dans mon co
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    		String toto = "tété";
    		System.out.println("toto est devenu "+toto.replaceAll("é","e"));
    et ca me donne ca:
    C:\Users\CLV\Documents\Workspace>java MoisMots
    Charset par défaut : windows-1252
    Saisir un mois en lettres svp :
    déc
    avant transfo le mois est :déc
    toto est devenu tete
    apres transfo le mois est :iéc

    donc on dirait que le "é" recuperé par la console est mal compris ensuite par la suite du programme car le "é" de "tété" est bien détécté et changé mais pas celui de "déc"...

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    On est revenu à un problème avec le compilateur. Ton fichier .java est en utf-8, et le compilateur croit qu'il est en windows-1252.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2015
    Messages : 55
    Par défaut
    merci, mais du coup on ne peut pas corriger cela, j'ai pourtant specifier java -Dfile.encoding=windows-1252 MoisMots ?

    Cedric

  10. #10
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    C'est quoi le rapport ? Je te parle du compilateur. On a déjà vu dans une autre discussion comment réconcilier le compilateur et l'encodage des fichiers .java
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  11. #11
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2015
    Messages : 55
    Par défaut
    j'ai installé NotePad++, je converti mon fichier Java en faisant encodage -> Convert to ANSI
    Ensuite dans la console je fais Javac MoisMos2.java puis MoisMos2.java

    ET ca me donne :-( :

    C:\Users\CLV\Documents\Workspace>java MoisMots2
    Charset par defaut : windows-1252
    Saisir un mois en lettres svp :
    déc
    avant transfo le mois est :d?c
    toto est devenu tete
    apres transfo le mois est :i?c

    Désolé, je dois louper un truc

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Oui, en gros tu es en train de louper qu'il faut réussir à la fois

    - la compilation : le compilateur doit utiliser comme encodage, l'encodage du fichier .java, afin que le fichier .class généré contienne les bonnes Strings.
    - le lancement du programme : le programme doit utiliser comme encodage, l'encodage de la console, afin de lire les accents correctement.

    Donc, maintenant que tu as re-résolu le problème de compilation, tu dois re-résoudre le problème de console, et par exemple la passer en codepage 1252.

    Histoire donc, de gérer correctement les deux questions à la fois, au lieu d'osciller à en gérer une puis l'autre à tour de rôle.

    En fait, en programmation, et en tout dans la vie en réalité, il faut tout faire correctement. Se contenter de faire correctement une seule chose à la fois, ça ne marche pas.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2015
    Messages : 55
    Par défaut
    merci, je m'en suis sorti en corrigeant effectivement le lancement du programme et en me battant un peu avec NotePad++ :-)

    Voici un resumé rapide de ce que j'ai fait si ca peut aider quelqu'un
    Lire et utliser caractere speciaux.docx

    Bonne journée
    Cédric

  14. #14
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    55
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2015
    Messages : 55
    Par défaut
    @thelvin, si par hasard tu vois dans le fichier word que j'ai mis des trucs à modifier pour que ce soit plus explicite pour les autres, n'hésites pas à me le dire.
    encore merci

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

Discussions similaires

  1. [PHP 4] [PHP 4.4.1] probleme pour lire un fichier distant avec CURL
    Par seben dans le forum Langage
    Réponses: 6
    Dernier message: 27/11/2009, 08h38
  2. Besoin d'aide pour lire son avec SDL
    Par Spooky6900 dans le forum SDL
    Réponses: 1
    Dernier message: 28/02/2007, 18h12
  3. probleme pour lire un jeu
    Par warubi dans le forum Périphériques
    Réponses: 4
    Dernier message: 07/01/2007, 13h02
  4. [Système] probleme pour lire etc/shadow
    Par mafilek dans le forum Langage
    Réponses: 2
    Dernier message: 11/09/2006, 12h05
  5. Probleme pour lire un fichier Ini
    Par Sebinou dans le forum C++Builder
    Réponses: 11
    Dernier message: 10/03/2004, 23h22

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