IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Composants Java Discussion :

JTextPane et alphabets non latins


Sujet :

Composants Java

  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Par défaut JTextPane et alphabets non latins
    Bonjour,

    J'essaye d'afficher un texte comportant des caractères non latins provenant d'une requête sur une page Wikipédia (exemple) mais les caractères malais s'affichent mal : carrés au lieu des caractères.

    Quand je fais un System.err.println(text), les caractères sont OK dans la console d'Eclipse.
    Quand je fais un textPane.setText(text), les caractères sont affichés comme des carrés

    J'ai essayé de faire un textPane.setContentType("text/plain; charset=UTF-8") mais çà ne change rien.

    Comment faire pour afficher correctement les caractères ?

    Merci

  2. #2
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,


    Il y a deux possibilités :
    • Soit le texte n'est pas lu correctement. Dans ce cas il faut vérifier que la lecture se fasse bien avec le bon encodage.
    • Soit la police de caractère ne sait pas représenter ce caractère. La plupart de nos polices occidentales ne savent pas afficher les caractères orientales.
      Il faut alors utiliser une police supportant ces caractères...


    a++

  3. #3
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Par défaut
    Merci

    J'ai fait un certain nombre de tests supplémentaires :
    • Faire un system.err.println() du texte avec le setText() : Le texte s'affiche correctement dans la console d'Eclipse
    • Mettre un menu contextuel sur le JTextPane qui récupère le texte (qui est un lien HTTP) et ouvre Firefox avec : le lien est bien passé à Firefox (avec les caractères malais)
    • Copier le texte malais (avec les carrés) depuis le JTextPane et le coller dans la barre d'adresse de FireFox : le lien s'affiche bien (avec les caractères malais) et en validant la page s'affiche
    • Copier le texte malais depuis le JTextPane et le coller dans Notepad++ en ayant au préalable encodage UTF-8 : le texte s'affiche bien. Ca marche aussi avec Notepad (on ne peut rien lui préciser), avec Eclipse (fichier en UTF-8 ou aussi dans la boîte de recherche de texte)
    • Copier le texte malais depuis le JTextPane et le coller dans un JTextField : à nouveau les carrés


    Après tous ces tests, j'ai l'impression :
    • Que le texte est correctement lu (vu que je le récupère correctement ensuite)
    • Que les polices sont disponibles sur mon PC et utilisables par tous les softs

    Malgré çà, je n'arrive pas à les afficher correctement dans mon appli

    Je suis perdu

  4. #4
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Ben ca confirme le problème de police : celle utilisée par défaut par ton JTextPane ne gère pas les caractères Malais. Donc il se contente d'afficher un carré.

    Firefox doit surement utiliser une police de caractères plus complète.

    Utilises GraphicsEnvironnement.getAllFonts() pour rechercher toutes les polices afin de trouver celle qui accepte ces caractères (de mémoire avec la méthode canDisplay() de la classe Font).

    a++

  5. #5
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Par défaut
    Ok, merci pour toutes ces infos.

    Parmi toutes les fonts reconnues par Java, il n'y en a que 2 qui acceptent le texte en malais: Arial Unicode MS et Kartika. Et le JTextPane choisit Tahoma. Le problème semble bien être là.

    Est-ce qu'il y a des moyens pour avoir une police adaptée automatiquement ?
    Je pourrais proposer à l'utilisateur de choisir lui-même sa police, mais c'est pas super pratique.

    Merci
    Nico

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 179
    Par défaut
    Citation Envoyé par NicoV Voir le message
    Parmi toutes les fonts reconnues par Java, il n'y en a que 2 qui acceptent le texte en malais: Arial Unicode MS et Kartika. Et le JTextPane choisit Tahoma. Le problème semble bien être là.
    Et encore, ce ne sont pas les polices reconnues par Java, mais celles installés sur ton système d'exploitation. Tahoma est la police utilisée par défaut avec les Look & Feel Windows, mais sur d'autres plate-forme, ce sera autre chose.

    http://java.sun.com/j2se/1.3/docs/guide/intl/addingfonts.html


    Tu peux toujours chercher parmi les Font disponibles, une qui gère les caractères que tu veux et l'affecter à ton JTextPane avec setFont. Ou même carrément construire l'objet Font directement avec son nom si tu es sûr que la police est installée sur le système de l'utilisateur.

    Sinon, je crois que tu as la possibilité d'embarquer la police adéquate dans le jar de ton appli et de la charger dynamiquement.

  7. #7
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Par défaut
    Pour moi, ce sont des polices reconnues par Java: je les ai obtenues avec getAllFonts() + test avec canDisplay() pour voir si elles pouvaient afficher le texte).

    Le problème c'est que je ne sais absolument pas quels types de caractères je vais pouvoir récupérer car j'affiche des pages qui proviennent des Wikipédias dans les différentes langues. L'exemple donné dans le premier post est du Wikipédia anglais sur une page avec un lien vers le Wikipédia malais.
    En général, il y a pleins de langues dans une page Wikipédia (car il y a les liens inter-wiki).

    Je crois que je vais abandonner l'idée de pouvoir tout afficher.

    Merci

  8. #8
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Tu peux éventuellement utiliser une police qui contiendrait tous les caractères Unicodes, même si je ne sais pas si cela existe...


    Ce que tu peux faire sinon, c'est utiliser la méthode canDisplayUpTo() afin de déterminer le premier caractère non-affichable afin de détecter les chaines problématiques.

    Tu peux alors éventuellement afficher un message en proposant d'autre police...


    a++

  9. #9
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 179
    Par défaut
    Citation Envoyé par NicoV Voir le message
    Pour moi, ce sont des polices reconnues par Java: je les ai obtenues avec getAllFonts() + test avec canDisplay() pour voir si elles pouvaient afficher le texte).
    Je t'assure que ce sont celles disponibles sur Ton système, pas partout. Aucune chance de trouver du Tahoma sur un système Linux...

    Extrait de la première ligne de la doc: "The GraphicsEnvironment class describes the collection of GraphicsDevice objects and Font objects available to a Java(tm) application on a particular platform."

    Citation Envoyé par adiGuba Voir le message
    Tu peux éventuellement utiliser une police qui contiendrait tous les caractères Unicodes, même si je ne sais pas si cela existe...
    Si ça existe, mais elles sont trèèèès lourdes....
    Arial Unicode MS en est une, mais c'est du Microsoft et peut-être pas installée partout...
    http://fr.wikipedia.org/wiki/Wikip%C...a:Unicode/Test

  10. #10
    Membre confirmé
    Inscrit en
    Octobre 2006
    Messages
    108
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 108
    Par défaut
    Merci pour toutes les réponses.

    Mon dernier test a été de charger une page de Wikipédia où il y avait des caractères de pas mal de langues et d'essayer avec toutes les polices reconnues par Java si il y en avait une qui pouvait tout afficher. Résultat : aucune ne marche pour tous les caractères de la page.

    Je crois donc que je vais abandonner et tant pis pour les caractères non reconnus par la police utilisée par défaut par Java.

    Citation Envoyé par kwxyz Voir le message
    Je t'assure que ce sont celles disponibles sur Ton système, pas partout. Aucune chance de trouver du Tahoma sur un système Linux...
    Euh, oui, c'est ce que je disais : quand je parle de police reconnue par Java, je parle bien évidemment de la situation dans laquelle je lance mon programme. Tahoma est reconnue par Java, après elle peut être disponible sur mon système ou pas (ce qui fera qu'elle ne sera plus disponible pour Java non plus). Au vu de la doc Java, rien n'empêche qu'il existe des polices du système qui ne soient pas reconnues par Java.

    Citation Envoyé par kwxyz Voir le message
    Si ça existe, mais elles sont trèèèès lourdes....
    Arial Unicode MS en est une, mais c'est du Microsoft et peut-être pas installée partout...
    http://fr.wikipedia.org/wiki/Wikip%C...a:Unicode/Test
    On dirait que malgré sa taille énorme (22Mo sur mon PC), même Arial Unicode MS ne gère pas tout.
    Tant pis, çà ne concerne qu'un nombre de cas réduits, je vais laisser tomber.
    Merci encore !

  11. #11
    Membre expérimenté
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 179
    Par défaut
    Citation Envoyé par NicoV Voir le message
    Euh, oui, c'est ce que je disais : quand je parle de police reconnue par Java, je parle bien évidemment de la situation dans laquelle je lance mon programme.
    OK, pour moi "reconnue par Java" signifie "disponible de manière portable". C'est là-dessus que je voulais attirer ton attention, c'est tout. Si tu en es conscient alors tout va bien

Discussions similaires

  1. XML-Flash - caractères non-latin
    Par heyax dans le forum Flash
    Réponses: 2
    Dernier message: 26/02/2008, 19h12
  2. exception alphabet non reconnu
    Par matrixspirit dans le forum Bioinformatique
    Réponses: 0
    Dernier message: 24/01/2008, 18h53
  3. Problème de caractères non latin dans un formulaire
    Par Huntress dans le forum Langage
    Réponses: 3
    Dernier message: 31/01/2006, 14h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo