Caractères arabe en java (encodage)

Résolu
Bonjour à tous,
Voila, je galère depuis deux jours avec un petit programme qui lit une chaine de caractère
en arabe à travers la console (j'utilise eclipse).
mon souci est que:l'affichage des caractères ne se fait pas correctement!
ci dessous un exemple:

public class encodagecara {

public static void main(String args[])throws java.io.IOException{
String s = " ??????? ";
System.out.println("la chaine est:"+s);

String str1;
String str2;
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Entrez une chaine à afficher :");
str1 =in.readLine().trim();
str2 = new String(str1.getBytes(),Charset.forName("UTF-8"));
System.out.println("le caractère est:"+str2);
}}

la chaine s s'affiche correctement, par contre la chaine str2 pas correctement (caractères avec un format incompréhensible)
si vous pouvez me donner un coup de main !!

merci à vous

9 réponses

  1. Modérateur
    J'ai fait quelques tests chez moi, et comme ceci, ça marche :

    Prenons une phrase de test écrit en arabe : s
    Si tu lis au clavier cette phrase avec ton code précédent, tu vas obtenir str2.

    Maintenant, exécutes ce code, en remplaçant s par sa valeur directement dans le code :

    for (Entry<String, Charset> entry : Charset.availableCharsets().entrySet())
    	System.out.println(entry.getKey()+"\t"+new String(s.getBytes(), entry.getValue()));

    Une liste va s'afficher, et en face chaque nom il va y avoir une représentation différente, le but du jeu est de retrouver celles qui affichent ta phrase exactement comme str2 (chez moi c'est "windows-1252", "windows-1254", "windows-1258")

    Ensuite, il suffit de modifier un petit peu ton code pour avoir ce qu'il faut :

    str2 = new String(str1.getBytes(Charset.forName("windows-1252")), Charset.forName("UTF-8")));
    1. Modérateur
      Voici un code de test complet pour trouver "windows-1252" ou son équivalent chez toi...

      import java.nio.charset.Charset;
      import java.util.Map.Entry;
      import java.util.Scanner;
      
      public class Test
      { 
      public static void main(String[] args)
      {
      String test = "\u060b";
      
      Scanner sc =new Scanner(System.in);
      
      System.out.println("Copier-coller cette phrase : "+test);
      System.out.println("Voici la phrase à chercher : "+sc.nextLine());
      System.out.println("\nAppuyer sur Entrée pour afficher la liste des possibilités");
      sc.nextLine();
      
      for (Entry<String, Charset> entry : Charset.availableCharsets().entrySet())
          System.out.println(new String(test.getBytes(),entry.getValue())+"\t" +entry.getKey());
      }
      }
  2. J ai testé la 1ère solution( aussi le dernier test)
    j'ai bien trouvé que le format correct c'est de l'UTF-8!!
    (la chaine s'affiche bien avec l'encodaage UTF8)

    et pourtant le problème persiste encore,

    je ne sais pas s'il y a un moyen de vous envoyer les captures d'écrans(dans un fichier word ou pdf) pour vous montrer les résultats qui s'affichent .
  3. Merci !! bravo pour vous ! vous avez bien réussi à résoudre mon problème.

    en fait ,l'encodage c'était windows-1254 , donc je l ai converti au UTF8!

    str2 = new String(str1.getBytes(Charset.forName("windows-1254")), Charset.forName("UTF-8"));

    Encore merci à vous!!!
    1. Modérateur
      Plutôt qu'utiliser getBytes et de réinterpréter les bits en lui imposant un Charset, utilises plutôt un toCharArray, voire directement le String, pour faire ta copie...

      String str2a = new String(str1);
      String str2b = new String(str1.toCharArray());
      1. Merci pour votre réactivité!

        je viens de le tester (voir le programme ci dessous)
        public class encodagecara {

        public static void main(String args[])throws java.io.IOException{
        String s = " ???? ????? ???? ??????? ";
        System.out.println("la chaine est:"+s);

        String str1;
        String str2;
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        System.out.println("Entrez une chaine à afficher :");

        str1 =in.readLine().trim();

        String str2a = new String(str1);
        String str2b = new String(str1.toCharArray());
        // str2 = new String(str1.getBytes(),Charset.forName("UTF-8"));
        System.out.println("la chaine str2a est:"+str2a);
        System.out.println("le caractère str2b est:"+str2b);
        }}

        la sortie de la console est:
        la chaine est: ???? ????? ???? ???????
        Entrez une chaine à afficher :
        ??????
        la chaine str2a est:Ù...ستÙ...رة
        le caractère str2b est:Ù...ستÙ...رة
        1. Modérateur
          Pour le forum ce n'est pas très pratique les caractères arabes ça donne ??????

          Il y a une source d'erreur que je n'ai pas souligné, et je pense que ça vient de là, c'est le InputStreamReader, il faudrait essayer de lui passer un argument Charset.forName.
          1. Tout à fait,les chaine déclaré s'affiche normalement (en arabe).

            je pense que le souci est au niveau du inputstreamreader et aussi le format des chaines lus à travers la console!!
            j'ai essayé de traiter tout les cas mais le problème persiste!

            public class encodagecara {

            public static void main(String args[])throws java.io.IOException{
            String s = " ???? ????? ???? ??????? ";
            System.out.println("la chaine est:"+s);

            String str1;
            String str2;
            BufferedReader in = new BufferedReader(new InputStreamReader(System.in,Charset.forName("UTF-8")));
            System.out.println("Entrez une chaine à afficher :");

            str1 =in.readLine().trim();

            String str2a = new String(str1);
            String str2b = new String(str1.toCharArray());
            str2 = new String(str1.getBytes(),Charset.forName("UTF-8"));

            System.out.println("la chaine str2a est:"+str1);
            System.out.println("la chaine str2a est:"+str2a);
            System.out.println("la chaine str2b est:"+str2b);
            System.out.println("la chaine str2 est:"+str2);
            }}

            sortie de la console:

            la chaine est: ???? ????? ???? ???????
            Entrez une chaine à afficher :
            ?????
            la chaine str2a est:تغطÙSØ©
            la chaine str2a est:تغطÙSØ©
            la chaine str2b est:تغطÙSØ©
            la chaine str2 est:تغطÙSØ©
            1. Tout à fait pour l'affichage des chaines en arabes,
              je viens d'essayer les cas possible , mais le problème persiste!

              je pense que le problème viens du l encodage des chaine saisis à travers la console!!
              public class encodagecara {

              public static void main(String args[])throws java.io.IOException{
              String s = " ???? ????? ???? ??????? ";
              System.out.println("la chaine est:"+s);

              String str1;
              String str2;
              BufferedReader in = new BufferedReader(new InputStreamReader(System.in,Charset.forName("UTF-8")));
              System.out.println("Entrez une chaine à afficher :");

              str1 =in.readLine().trim();

              String str2a = new String(str1);
              String str2b = new String(str1.toCharArray());
              str2 = new String(str1.getBytes(),Charset.forName("UTF-8"));

              System.out.println("la chaine str2a est:"+str1);
              System.out.println("la chaine str2a est:"+str2a);
              System.out.println("la chaine str2b est:"+str2b);
              System.out.println("la chaine str2 est:"+str2);
              }}

              La sortie console :

              la chaine est: ???? ????? ???? ???????
              Entrez une chaine à afficher :
              ?????
              la chaine str2a est:تغطÙSØ©
              la chaine str2a est:تغطÙSØ©
              la chaine str2b est:تغطÙSØ©
              la chaine str2 est:تغطÙSØ©