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

Résolu/Fermé
GMHB Messages postés 8 Date d'inscription jeudi 23 décembre 2021 Statut Membre Dernière intervention 4 janvier 2022 - Modifié le 24 déc. 2021 à 08:50
KX Messages postés 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 - 25 déc. 2021 à 17:28
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 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
Modifié le 24 déc. 2021 à 09:32
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 14351 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 29 avril 2024 1 821
24 déc. 2021 à 16:11
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 jeudi 23 décembre 2021 Statut Membre Dernière intervention 4 janvier 2022
24 déc. 2021 à 10:37
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 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
24 déc. 2021 à 15:16
En effet, tu devrais ajouter
import java.nio.charset.Charset;
0
GMHB Messages postés 8 Date d'inscription jeudi 23 décembre 2021 Statut Membre Dernière intervention 4 janvier 2022
Modifié le 25 déc. 2021 à 17:22
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 16734 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 24 avril 2024 3 015
25 déc. 2021 à 17:28
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