Caractères arabe en java (encodage)

Résolu/Fermé
donaldmad Messages postés 8 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 21 mars 2013 - Modifié par donaldmad le 19/02/2013 à 12:34
donaldmad Messages postés 8 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 21 mars 2013 - 19 févr. 2013 à 16:57
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
A voir également:

9 réponses

KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
19 févr. 2013 à 14:28
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
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
Modifié par KX le 19/02/2013 à 14:43
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());
}
}
0
donaldmad Messages postés 8 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 21 mars 2013 2
19 févr. 2013 à 15:05
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
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
19 févr. 2013 à 16:04
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
0
donaldmad Messages postés 8 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 21 mars 2013 2
19 févr. 2013 à 16:55
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
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
19 févr. 2013 à 12:53
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());
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
donaldmad Messages postés 8 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 21 mars 2013 2
19 févr. 2013 à 13:15
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:Ù...ستÙ...رة
0
KX Messages postés 16733 Date d'inscription samedi 31 mai 2008 Statut Modérateur Dernière intervention 31 janvier 2024 3 015
19 févr. 2013 à 13:42
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.
0
donaldmad Messages postés 8 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 21 mars 2013 2
19 févr. 2013 à 14:11
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Ø©
0
donaldmad Messages postés 8 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 21 mars 2013 2
19 févr. 2013 à 14:17
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Ø©
0
donaldmad Messages postés 8 Date d'inscription mardi 19 février 2013 Statut Membre Dernière intervention 21 mars 2013 2
19 févr. 2013 à 16:57
donc le problème est résolu!!
0