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

Collection et Stream Java Discussion :

java.lang.String#toUpper et le char µ


Sujet :

Collection et Stream Java

  1. #1
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 171
    Points : 97
    Points
    97
    Par défaut java.lang.String#toUpper et le char µ
    Salut à tous voila je vous s'exclique mon problème, je souhaite convertir une chaine de caractere en majuscule et j'utilisé donc le fameux String.toUpper, jusqu'au jour où un de mes utilisateurs a souhaité utiliser le caractère µ (micron). Et apparement la fonction renvoi un caractere qui s'affiche sous forme de '?' mais qui n'en ai pas un (code ascii différent).
    J'ai donc mi en place une moulinette qui regle le probleme, Mais j'aimerais savoir si je me trouve devant un bug du package java.lang!

    Merci

  2. #2
    Membre chevronné
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 75
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Points : 1 855
    Points
    1 855
    Par défaut
    récupère le code du caractère que tu obtiens et regarde dans les tables UNICODE.
    peut être un problème de ton affichage
    J'ai des principes: je peux toujours trouver une bonne raison pour les contredire .... mais j'ai des principes!
    (mon excellent bouquin sur Java : https://eska-publishing.com/fr/livre...822407076.html)

  3. #3
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 842
    Points : 22 855
    Points
    22 855
    Billets dans le blog
    51
    Par défaut
    Affichage dans la console ? Dans une GUI ?
    Probablement que la police utilisee ne contient pas le glyphe de ce caractere.

    Si c'est dans la console, on ne peut pas faire grand chose.
    Si c'est dans une GUI, essaie de voir avec le caractere grecque equivalent : la lettre mu (U+03BC) mais la encore il faut que la police contienne ce glyphe.

    A noter que d'apres ma table des caracteres la capitale de mu c'est l'equivalent du M majuscule (U+039C) tout simplement...
    Toujours d'apres cette table il n'existe pas de majuscule pour le symbole du micro (U+00B5). Cela peut donc etre un bug et dans ce cas tu peux aller chez Sun leur fournir un bug-report ou voir si ce n'est pas mentionne dans la bug data-base.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  4. #4
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 171
    Points : 97
    Points
    97
    Par défaut
    Affichage dans la console ? Dans une GUI ?
    Affichage en console et en appli web.

    Mon problème n'est pas, a mon sens un probleme d'affichage.
    le code du micro (µ) est 181 apres l'avoir mi en majuscule le code est 924.
    A priori apres avoir fouiné un peu dans le code source du jdk, j'ai remarqué un traitement spéciale pour 3 caracteres dont le caractere 'µ' qui ici m'interresse.
    Alors soit je n'ai pas le bonne alphabet / police pour afficher sa majuscule, mais je penche plutot pour une mauvaise spécification de la majuscule de cette lettre. D'ailleur si le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    System.out.println("la lettre µ");
    System.out.println("code de la maj de µ :" + Character.toUpperCase('µ'));
    System.out.println("code de la minuscule de la maj de µ :"+ Character.toLowerCase(Character.toUpperCase('µ')));
    produit la sortie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    la lettre µ
    code de la maj de µ :?
    code de la minuscule de la maj de µ :?
    La minuscule de la majuscule du caractere µ n'est pas µ !!!

  5. #5
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 842
    Points : 22 855
    Points
    22 855
    Billets dans le blog
    51
    Par défaut
    Hum bizarre ce traitement specifique. Je crois que tu es bon pour aller remplir un rapport de bug chez Sun donc.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Il n'y a pas de problème, tout est correct.

    Le symbole micro (µ, unicode 181) n'est pas la même chose que le caractère mu (minuscule, unicode 956). Le symbole micro représente un préfixe d'unité, tandis que le caractère mu fait partie de l'alphabet grec.
    Leur capitale à chacun est Mu (majuscule, unicode 924), qui est représenté exactement comme la lettre latine 'M'. Puisque si on demande la casse supérieure de micro (qui était mu), on doit obtenir Mu.

    Unicode a décidé de séparer le caractère 181 des caractères 924 et 956, afin de rester cohérent par rapport au subset ISO-8859-1 qui, lui, comprend le caractère 181. Seulement, pour former un set grec, ils ont replacé le µ dans son contexte, à sa place : 956.

    Pour vérifier si deux chaînes sont identiques, je te conseille de regarder de plus près le code de la méthode java.lang.String.regionMatches(boolean,int,String,int,int). Sauf en ce qui concerne l'alphabet Géorgien, une comparaison sur le basée sur java.lang.Character.toUpperCase(char) semble être la seule solution viable.

  7. #7
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 171
    Points : 97
    Points
    97
    Par défaut
    Tu m'a l'air d'en connaitre loin sur le codage des caracteres, mais pour faire simple, le faite que la lettre µ est la seule qui une fois mis en majuscule puis en minuscule n'est plus la meme que au dépard...
    Enfin suivant le source de toUpper on voit clairement que pour cette lettre, il y a une gestion spéciale.
    J'ai poster sur le bug report de sun on verra bien

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Sur ce fichier PDF (document officiel de la spécification Unicode), on voit clairement dans les explications de la page 428 (6e du document) que le symbole micro (U+00B5) est la même chose que le caractère (U+03BC). Ils représentent la même chose, mais ont deux codes distincts.

    C'est inutile de remplir un rapport de bug pour ces cas-là, il me semble : c'est la spécification Unicode, et Java s'y conforme précisément.

  9. #9
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 842
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 842
    Points : 22 855
    Points
    22 855
    Billets dans le blog
    51
    Par défaut
    Bon a savoir ca, nottament en cas de besoin de comparer des chaines apres plusieurs transformations.
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  10. #10
    Membre expérimenté
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 252
    Points : 1 419
    Points
    1 419
    Par défaut
    Bah ! La méthode String.equalsIgnoreCase utilise ce système de comparaison. Testez la classe suivante et vous verrez :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class MicroTest {
      public static void main (String... args) {
        System.out.println("\u00B5".equalsIgnoreCase("\u03BC"));
      }
    }
    Si la casse n'est pas importante, autant utiliser ce que Java nous offre. Si elle l'est, faites une comparaison de type equalsIgnoreCase, tout en vérifiant (isUpperCase(c) && isUpperCase(d)) || (isLowerCase(c) && isLowerCase(d))) pour chaque caractère. C'est lourd, je sais.

  11. #11
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    171
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 171
    Points : 97
    Points
    97
    Par défaut
    Merci pour tes réponses

Discussions similaires

  1. java.lang.String cannot be cast to Item
    Par cotede2 dans le forum Débuter avec Java
    Réponses: 6
    Dernier message: 10/11/2009, 14h34
  2. Java.lang.String, simplifier endsWith()
    Par Fused dans le forum Langage
    Réponses: 4
    Dernier message: 13/04/2009, 20h35
  3. Réponses: 1
    Dernier message: 24/02/2009, 19h18
  4. faultString: java.lang.ArrayStoreException: : java.lang.String
    Par Dev_info dans le forum Services Web
    Réponses: 3
    Dernier message: 21/05/2007, 15h42
  5. Réponses: 3
    Dernier message: 19/05/2006, 20h38

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