Précédent   Forum du club des développeurs et IT Pro > Java > Général Java > Langage
Langage Forum d'entraide sur le langage Java et autres langages pour la JVM : syntaxe, POO, conventions, API standard. Avant de poster -> FAQ Java
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 09/01/2013, 12h42   #1
sylverspoon
Futur Membre du Club
 
Inscription : avril 2002
Messages : 83
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 83
Points : 17
Points : 17
Par défaut Problème drawString avec Font exotique

Bonjour,

Dans mon applet je dessine des textes dans un Graphic2D.
Tout va bien tant que la Font utilisée est "standard" (tahoma, arial ...)

Par contre, si mon texte doit être écrit en Webdings et bien j'ai un beau carré !

Après diverses recherches je pense a voir compris que cela vient des code unicode des caractères de mes textes.

Je converti mes String avec le code suivant :
Code :
1
2
3
4
5
6
7
8
9
10
11
 
private String getUnicode(String Montexte) 
{
String unicodeStr = "";
char[] charArray = Montexte.toCharArray();
for (int i = 0; i < charArray.length; i++) 
{	
    	unicodeStr = unicodeStr + "\\u" + Integer.toHexString(charArray[i] | 0x10000).substring(1);	
}
return unicodeStr;
}
Mon problème est que les codes unicode de mes caractères se sont pas corrects.
Je m'explique, je dois écrire la lettre 'b' en utilisant la Font Webdings" et cela doit donner un symbole représentant un vélo.

Le code de ce symbole est \uf062 mais le code que me renvoie ma fonction est \u0062 et donc j'obtiens un beau carré dans mon applet.

Avez vous un idée ?

Merci beaucoup.
sylverspoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 16h47   #2
thelvin
Modérateur
 
Inscription : septembre 2004
Messages : 7 087
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 7 087
Points : 10 315
Points : 10 315
Envoyer un message via Skype™ à thelvin
Citation:
Envoyé par sylverspoon Voir le message
Dans mon applet je dessine des textes dans un Graphic2D.
Tout va bien tant que la Font utilisée est "standard" (tahoma, arial ...)

Par contre, si mon texte doit être écrit en Webdings et bien j'ai un beau carré !

Après diverses recherches je pense a voir compris que cela vient des code unicode des caractères de mes textes.
Plus exactement, la fonte webdings n'a pas de mapping unicode pour les caractères qu'elle contient. Or, Java ne peut afficher que les caractères mappés aux codes Unicodes demandés.
Peut pas. Pas possible. Sauf à la rigueur en imaginant une bibliothèque JNI tierce qui servirait à contourner ce problème.

La raison est qu'en principe, ces fontes ne servent pas à afficher un texte avec des dessins à la place des lettres (auquel cas elles auraient un mapping Unicode liant ces dessins aux lettres correspondantes,) mais à fournir des symboles spéciaux ne correspondant à aucun autre caractère que celui qu'il dessine. Ça se voit dans les WingDings, la plupart des caractères ayant un mapping Unicode. Mais pas dans Webdings, aucun caractère ne correspondant à un caractère Unicode. Si on demande à Java d'afficher le caractère smiley, il pourra le faire avec Wingdings parce que Wingdings a le caractère Unicode smiley. Webdings ne contient aucun caractère Unicode et Java ne peut rien en faire.
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher du poisson, il videra le lac et au bout de deux ans son village ne mangera plus jamais.
Partagez vos connaissances, mais aussi comment s'en servir.
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/01/2013, 17h16   #3
sylverspoon
Futur Membre du Club
 
Inscription : avril 2002
Messages : 83
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 83
Points : 17
Points : 17
Merci de votre réponse thelvin.

C'est râlant car en mettant en dur dans mon code

Code :
1
2
3
4
 
...
g2.drawString("\uf062", x,y);
...
Le symbole souhaité s'affiche bien ...


Il n'y a donc pas de moyen "d’obtenir" le code \uf062 en lieux et place de \u0062 ? En détectant la police ? si oui sur quel critère ?

J'utilise déjà la méthode canDisplayUpTo(String str) de ma Font pour écarter les polices les plus fréquentes dans mon cas et qui ne posent pas problème.
sylverspoon est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 09/01/2013, 19h09   #4
thelvin
Modérateur
 
Inscription : septembre 2004
Messages : 7 087
Détails du profil
Informations forums :
Inscription : septembre 2004
Messages : 7 087
Points : 10 315
Points : 10 315
Envoyer un message via Skype™ à thelvin
Ok, alors apparemment mes informations datent un peu.
J'ignorais totalement que "\uf062" s'affiche bien en Java avec Webdings. C'est une utilisation intéressante de la zone Unicode à usage privé.

voici comment tu peux transformer une String de caractères tapés sous Windows, en leur équivalent Webdings :

Code :
1
2
3
4
5
6
7
8
9
10
11
public static char asciiToWindowsReserved(char ch) {
  return (char)(0xf000 + ch);
}
 
public static String asciiToWindowsReserved(String text) {
  char[] array = new char[text.length()];
  for(int i = 0; i < array.length; i++) {
    array[i] = asciiToWindowsReserved(text.charAt(i));
  }
  return new String(array);
}
__________________
Si tu donnes un poisson à un homme, il mangera un jour. Si tu lui apprends à pêcher du poisson, il videra le lac et au bout de deux ans son village ne mangera plus jamais.
Partagez vos connaissances, mais aussi comment s'en servir.
thelvin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 09h35   #5
sylverspoon
Futur Membre du Club
 
Inscription : avril 2002
Messages : 83
Détails du profil
Informations forums :
Inscription : avril 2002
Messages : 83
Points : 17
Points : 17
Mille mercis thelvin, cela fonctionne.

J'ai essayé de "convertir" tous les texte que je dois afficher pour éviter le test canDisplayUpTo(String str) qui mais pour les polices "standard" cela ne fonctionne pas.

Je vais essayer d'optimiser mon code pour améliorer les performances.

Encore merci
sylverspoon est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Cette discussion est résolue.
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 02h57.


 
 
 
 
Partenaires

Hébergement Web