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

avec Java Discussion :

Déterminer si un texte est compatible UTF-8


Sujet :

avec Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 95
    Par défaut Déterminer si un texte est compatible UTF-8
    Bonjour à tous,

    J'essaie d'écrire une méthode en Java capable de déterminer si un texte (saisi en String) est compatible au format UTF-8.
    Si j'ai bien tout compris, Java traite tout en UNICODE.

    Il me faut donc passer ma chaine de caractères en chaine de bytes et procéder bytes à bytes.
    Mais je ne parviens pas à me servir du package java.nio.charset .

    Je précise que je débute vraiment en Java (2 petites semaines!) et que je n'ai aucun passé de programmeur.

    Merci pour vos lumières.
    Wise_Sherkaan

  2. #2
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    Toute String est compatible UTF-8 à mon avis. Java code tout en interne en UTF-16 (arrêtez moi si je dis une bêtise). Du coup, convertir en tableau de byte sera toujours possible, et je ne vois pas ce que tu voudrais vérifier à ce moment là.

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juillet 2008
    Messages
    95
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Juillet 2008
    Messages : 95
    Par défaut
    Bjour,

    Effectivement, vu sous cet angle-là, il n'y a aucun test à faire

    Du coup, mettons qu'on parte d'une série de bytes ; savoir s'ils sont compatibles UTF-8 reviendrait-il à savoir si leur valeur en unicode est inférieure à une certaine valeur unicode Uxxx? (que je vais m'empresser de chercher dans une table)

    Merci encore, et toutes mes excuses si ces questions sont naïves.
    Wise_Sherkaan

  4. #4
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    Il n'existe pas de questions bêtes, donc pas de problème

  5. #5
    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,

    Citation Envoyé par djsnipe Voir le message
    Toute String est compatible UTF-8 à mon avis. Java code tout en interne en UTF-16 (arrêtez moi si je dis une bêtise). Du coup, convertir en tableau de byte sera toujours possible, et je ne vois pas ce que tu voudrais vérifier à ce moment là.
    Java code bien les caractères en UTF-16, mais je ne sais pas pour autant si toutes les chaines peuvent être encodé en UTF-8. Il faudrait connaitre les différences entres les deux encodages pour savoir s'il n'y a pas des caractères existant en UTF-16 qui serait absent de l'UTF-8...


    Citation Envoyé par Wise_Sherkaan Voir le message
    Merci encore, et toutes mes excuses si ces questions sont naïves.
    Non ces questions sont loin d'être naïves...


    En fait il y a deux questions car il y a deux sens de convertion :
    • Savoir si une String Java peut être convertie en bytes selon un certain encodage.
    • Savoir si des bytes peuvent être converties en String selon un certain encodage.




    Pour le premier cas c'est assez facile, car on a une String en UTF-16 et il suffit au charset de savoir s'il arrive à encoder les caractères qu'elle contient.
    Cela se fait simplement avec les méthode canEncode() du Charset et du CharsetEncoder

    Exemple qui vérifie sur tous les charsets :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    		final String str = "un texte à 1 €";
    		int ok = 0;
    		int nok = 0;
     
    		for (Charset cs : Charset.availableCharsets().values())
    		{
    			boolean canEncode = cs.canEncode() && cs.newEncoder().canEncode(str);
    			System.out.printf( "%20s canEncode '%s' => %s%n", cs, str, canEncode);
    			if (canEncode) ok++;
    			else nok++;
    		}
    		System.out.println();
    		System.out.println("Résultat : ");
    		System.out.printf("%10d OK%n", ok);
    		System.out.printf("%10d NOK%n", nok);
    Le signe EURO "€" est absent de nombreux charset, et le résultat n'est positif que sur 29 charsets sur mon poste. En le supprimant on monte à 73.
    Ensuite c'est le "à" qui pose problème. En le supprimant également de la chaine on peut alors encoder avec 153 charsets (il ne me reste plus que 7 charsets exotiques qui ne peuvent représenter cette chaine).







    Le second test, de bytes vers String, est plus problématique.
    En effet le problème vient du fait qu'on n'est pas sûr du format des bytes, et que si on se trompe on peut avoir des résultats incorrect.

    En effet, un byte ne représente pas forcément le même caractère dans différents encodage. Ainsi on peut obtenir une chaine valable dans l'encodage choisit, mais qui ne correspond pas à l'encodage d'origine...

    Malheureusement à ma connaissance ce type d'erreur est très difficile à détecter...


    a++

  6. #6
    Membre chevronné Avatar de djsnipe
    Inscrit en
    Mai 2008
    Messages
    440
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 440
    Par défaut
    Citation Envoyé par adiGuba Voir le message
    Java code bien les caractères en UTF-16, mais je ne sais pas pour autant si toutes les chaines peuvent être encodé en UTF-8. Il faudrait connaitre les différences entres les deux encodages pour savoir s'il n'y a pas des caractères existant en UTF-16 qui serait absent de l'UTF-8...
    Pour moi, ce n'est pas le cas.
    Les caractères existants sont définis par la norme Unicode, selon différents plans. Ensuite, les différentes représentations UTF (Universal Transformation Format) représentent comment coder un de ces caractères en suite d'octets. C'est là que les différences existent entre UTF-8, 16 et 32, qui sont plus ou moins consomatrices d'espace disque/mémoire et qui apportent plus ou moins de compatibilité ASCII (en fait, uniquement l'UTF-8).

  7. #7
    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
    Citation Envoyé par djsnipe Voir le message
    Pour moi, ce n'est pas le cas.
    Oui tu dois avoir raison...

    Par contre cela peut être le cas si on utilise d'autre encodage.

    a++

Discussions similaires

  1. Tester si une chaîne est compatible UTF-8
    Par monnomamoi dans le forum Général Python
    Réponses: 2
    Dernier message: 16/04/2010, 08h00
  2. Déterminer si un fichier est un fichier texte
    Par MrAzerty dans le forum AIX
    Réponses: 2
    Dernier message: 19/03/2009, 08h57
  3. imposer une hauteur de div meme si le texte est plus long
    Par bébé dans le forum Balisage (X)HTML et validation W3C
    Réponses: 3
    Dernier message: 24/08/2005, 11h29
  4. Comment déterminer si un composant est d'un type "TMonT
    Par DanielR dans le forum C++Builder
    Réponses: 2
    Dernier message: 20/03/2004, 18h22
  5. Affichage de texte est mise à jour de l'écran
    Par Galdor_sp dans le forum OpenGL
    Réponses: 3
    Dernier message: 14/03/2004, 22h31

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