Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 5 sur 5
  1. #1
    Futur Membre du Club
    Inscrit en
    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.

  2. #2
    Modérateur

    Inscrit en
    septembre 2004
    Messages
    9 638
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 9 638
    Points : 14 548
    Points
    14 548

    Par défaut

    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.

  3. #3
    Futur Membre du Club
    Inscrit en
    avril 2002
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : avril 2002
    Messages : 83
    Points : 17
    Points
    17

    Par défaut

    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.

  4. #4
    Modérateur

    Inscrit en
    septembre 2004
    Messages
    9 638
    Détails du profil
    Informations forums :
    Inscription : septembre 2004
    Messages : 9 638
    Points : 14 548
    Points
    14 548

    Par défaut

    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.

  5. #5
    Futur Membre du Club
    Inscrit en
    avril 2002
    Messages
    83
    Détails du profil
    Informations forums :
    Inscription : avril 2002
    Messages : 83
    Points : 17
    Points
    17

    Par défaut

    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

+ Répondre à la discussion
Cette discussion est résolue.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •