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
    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Ø©
            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!!!