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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

+ 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