Java : fonction ne récupérant pas les lettres accentuées

Résolu
GMHB Messages postés 8 Date d'inscription   Statut Membre Dernière intervention   -  
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

J'apprends le langage Java, et étudie les méthodes String.
J'écris le code dans l'éditeur RJ TextEd., dans le format UTF-8.
La compilation se passe bien. A l'exécution effectuée dans la fenêtre "Invite de commande" de Windows 10, les mots accentués entrés par l'utilisateur s'affichent bien. Mais la fonction de traitement des valeurs entrées par l'utilisateur n'affiche plus les accents. Elle remplace les lettres accentuées par des points d'interrogation.
Sauriez-vous me diriger vers la solution de ce problème ? Je vous en remercie.

Voici mon code :

import java.util.*;

public class etudeString {
static String phrase, mot;
 public static void main(String[] argument)
 {
       
    System.out.println("--------------------------------------");
   System.out.println("L'objet String et ses m\u00E9thodes : ");
   System.out.println("--------------------------------------");
   Scanner lectureClavier = new Scanner(System.in);
       System.out.println("Entrez une phrase : ") ;
        phrase = lectureClavier.nextLine();
       System.out.println("Entrez un mot appartenant ou n'appartenant pas \u00E0 cette phrase " + phrase + " : ") ;
       mot = lectureClavier.next();
       analyser();
        
}// fin de main   

public static void analyser()
 {
     char guillemet = '"';
  System.out.println("Votre phrase : " + phrase);
  System.out.println("Votre mot : " + mot);
  System.out.println("");
  System.out.println("ANALYSE :");
  System.out.println("");
  if(phrase.endsWith("."))
   System.out.println("La phrase se termine par un point.");
  else
   System.out.println("La phrase NE se termine PAS par un point.");
  int position = phrase.indexOf(mot);
  if(position == -1)
   System.out.println("Le mot " + guillemet + mot + guillemet + " N'appartient PAS \u00E0 la phrase.");
  else
   System.out.println("Le mot " + guillemet + mot + guillemet + " se situe \u00E0 la position " + position + " dans la phrase.");
  if(phrase.startsWith(mot))
   System.out.println("Le mot " + guillemet + mot + guillemet + " se situe au d\u00E9but de la phrase.");
  else
   System.out.println("Le mot " + guillemet + mot + guillemet + " NE se situe PAS au d\u00E9but de la phrase.");
  if(phrase.endsWith(mot) || phrase.endsWith(mot + "."))
   System.out.println("Le mot " + guillemet + mot + guillemet + " se situe \u00E0 la fin de la phrase.");
  else
   System.out.println("Le mot " + guillemet + mot + guillemet + " NE se situe PAS \u00E0 la fin de la phrase.");
 }
 
} // fin class
Configuration: Windows / Firefox 95.0
A voir également:

3 réponses

KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Bonjour,

Le problème c'est l'encodage.

Tu peux ajouter ces deux petites lignes de code pour tester :
System.out.println("Encodage : " + Charset.defaultCharset());
phrase.chars().forEach(c -> System.out.println((char) c + "\t" + (int) c + "\t" + Character.getName(c)));

Par exemple, cela me donne ceci sur Eclipse :
Entrez une phrase : 
éloïse
Encodage : UTF-8
é 233 LATIN SMALL LETTER E WITH ACUTE
l 108 LATIN SMALL LETTER L
o 111 LATIN SMALL LETTER O
ï 239 LATIN SMALL LETTER I WITH DIAERESIS
s 115 LATIN SMALL LETTER S
e 101 LATIN SMALL LETTER E

Et cela me donne ceci sur la ligne de commande Windows :
Entrez une phrase : 
éloïse
Encodage : windows-1252
? 8218 SINGLE LOW-9 QUOTATION MARK
l 108 LATIN SMALL LETTER L
o 111 LATIN SMALL LETTER O
? 8249 SINGLE LEFT-POINTING ANGLE QUOTATION MARK
s 115 LATIN SMALL LETTER S
e 101 LATIN SMALL LETTER E

Comme tu le vois, l'encodage utilisé est différent (UTF-8 vs windows-1252) ce qui donne une interprétation des caractères lus (la valeur entière) différente, d'où son affichage impossible par la suite.

Mais la gestion de l'encodage est assez complexe à gérer, ce n'est pas un problème de débutant, donc en tant que débutant tu devrais peut-être "ignorer" ce problème et éviter l'usage des accents (ou éviter l'usage de l'invite de commande Windows...)
0
brucine Messages postés 22038 Date d'inscription   Statut Membre Dernière intervention   3 514
 
Bonjour,

Cette discussion est pour moi, si j'ose, du javanais, mais il n'y a pas moyen (sous réserve que le programme soit destiné à n'être exécuté que dans une version Windows "nationale") d'imposer dans Java comme cela se fait à la ligne de commandes la "bonne" table de caractères?
0
GMHB Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
Je vous remercie pour votre réponse.

J'obtiens une erreur à la compilation sur la ligne :
System.out.println("Encodage : " + Charset.defaultCharset());


Peut-être me manque-t-il une déclaration préalable ?
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
En effet, tu devrais ajouter
import java.nio.charset.Charset;
0
GMHB Messages postés 8 Date d'inscription   Statut Membre Dernière intervention  
 
Effectivement, ça va mieux ! :-)
Merci à vous.

J'ai trouvé une solution sur le web. Je modifie mon code en conséquence.
Si ça peut servir à des débutants comme moi qui aiment bien respecter l'orthographe :
import java.util.*;
public class string195 {
 static String phrase, mot;

 public static void main(String[] argument) {

  System.out.println("--------------------------------------");
  System.out.println("L'objet String et ses m\u00E9thodes : ");
  System.out.println("--------------------------------------");
  System.out.println("Entrez une phrase : ");
  phrase = System.console().readLine();
  System.out.println("Entrez un mot appartenant ou n'appartenant pas \u00E0 cette phrase " + phrase + " : ");
  mot = System.console().readLine();
  analyser();

 }// fin de main

 public static void analyser(){
  char guillemet = '"';
  System.out.println("");
  System.out.print("Votre phrase : ");
  System.console().printf("%s%n", phrase);
  System.out.print("Votre mot : ");
  System.console().printf("%s%n", mot);
  System.out.println("");
  
  System.out.println("ANALYSE :");
  System.out.println("");
  if (phrase.endsWith("."))
   System.out.println("La phrase se termine par un point.");
  else
   System.out.println("La phrase NE se termine PAS par un point.");
  int position = phrase.indexOf(mot);
  if (position == -1)
   System.out.println("Le mot " + guillemet + mot + guillemet + " N'appartient PAS \u00E0 la phrase.");
  else
   System.out.println("Le mot " + guillemet + mot + guillemet + " se situe \u00E0 la position " + position
     + " dans la phrase.");
  if (phrase.startsWith(mot))
   System.out.println("Le mot " + guillemet + mot + guillemet + " se situe au d\u00E9but de la phrase.");
  else
   System.out.println("Le mot " + guillemet + mot + guillemet + " NE se situe PAS au d\u00E9but de la phrase.");
  if (phrase.endsWith(mot) || phrase.endsWith(mot + "."))
   System.out.println("Le mot " + guillemet + mot + guillemet + " se situe \u00E0 la fin de la phrase.");
  else
   System.out.println("Le mot " + guillemet + mot + guillemet + " NE se situe PAS \u00E0 la fin de la phrase.");
  char car = phrase.charAt(0);
  System.out.println("La premi\u00E8re lettre de la phrase est " + guillemet + car + guillemet );
  car = mot.charAt(0);
  System.out.println("La premi\u00E8re lettre du mot " + guillemet + mot + guillemet + " est " + car);
  String extrait = phrase.substring(0,2);
  System.out.println("Les deux premi\u00E8res lettres de la phrase sont " + guillemet + extrait + guillemet );
  extrait = mot.substring(0,2);
  System.out.println("Les deux premi\u00E8res lettres du mot " + guillemet + mot + guillemet + " sont " + extrait);
 }

} // fin class
0
KX Messages postés 16761 Date d'inscription   Statut Modérateur Dernière intervention   3 020
 
Tant mieux si tu as pu te débloquer comme cela, toutefois ce n'est pas une solution miracle car System.console() ne fonctionne que si tu démarres le programme depuis une console, ce qui n'est pas le cas par exemple sur Eclipse.
0