Caractères arabe en java (encodage)

[Résolu/Fermé]
Signaler
Messages postés
8
Date d'inscription
mardi 19 février 2013
Statut
Membre
Dernière intervention
21 mars 2013
-
Messages postés
8
Date d'inscription
mardi 19 février 2013
Statut
Membre
Dernière intervention
21 mars 2013
-
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

Messages postés
16392
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
6 septembre 2021
2 876
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 42854 internautes nous ont dit merci ce mois-ci

Messages postés
16392
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
6 septembre 2021
2 876
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());
}
}
Messages postés
8
Date d'inscription
mardi 19 février 2013
Statut
Membre
Dernière intervention
21 mars 2013
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 .
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 42854 internautes nous ont dit merci ce mois-ci

Messages postés
16392
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
6 septembre 2021
2 876
En fait il ne s'agit pas de trouver l'encodage qui affiche correctement la chaîne, mais plutôt celui qui affiche la chaîne de la même manière que celle qui apparaît quand on la rentre au clavier...

https://www.petit-fichier.fr/2013/02/19/charset/charset.png
Messages postés
8
Date d'inscription
mardi 19 février 2013
Statut
Membre
Dernière intervention
21 mars 2013
2
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
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 42854 internautes nous ont dit merci ce mois-ci

Messages postés
16392
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
6 septembre 2021
2 876
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());
Messages postés
8
Date d'inscription
mardi 19 février 2013
Statut
Membre
Dernière intervention
21 mars 2013
2
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:Ù...ستÙ...رة
Messages postés
16392
Date d'inscription
samedi 31 mai 2008
Statut
Modérateur
Dernière intervention
6 septembre 2021
2 876
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.
Messages postés
8
Date d'inscription
mardi 19 février 2013
Statut
Membre
Dernière intervention
21 mars 2013
2
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Ø©
Messages postés
8
Date d'inscription
mardi 19 février 2013
Statut
Membre
Dernière intervention
21 mars 2013
2
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Ø©
Messages postés
8
Date d'inscription
mardi 19 février 2013
Statut
Membre
Dernière intervention
21 mars 2013
2
donc le problème est résolu!!