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

Langage Java Discussion :

Ma String est-elle compatible Latin1 ?


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Par défaut Ma String est-elle compatible Latin1 ?
    Bonsoir,

    comment puis-je tester si les différents caractères contenus dans ma chaine de caractères font bien partis de la table ISO-8859-1 (latin1) ?

    Avant de stocker une chaine de caractères dans une base de données dont le charset est défini sur latin1, comment puis-je m'assurer que ma chaîne de caractères ne comportent pas des caractères qui ne peuvent pas être conservés ?

    Merci pour votre réponse,
    F.

  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,


    Tu peux utiliser les CharsetEncoder et la méthode canEncode() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	String str = ...
     
    	CharsetEncoder encoder = Charset.forName("iso-8859-1").newEncoder();
    	boolean ok = encoder.canEncode(str);
    a++

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2004
    Messages
    118
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 118
    Par défaut
    Merci beaucoup pour ta réponse.
    Super

    F.

  4. #4
    Membre Expert

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Par défaut
    Mmmm, ca me paraît pas correct....

    Si je fais ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    		CharsetEncoder iso8859Encoder = Charset.forName("iso-8859-1")
    				.newEncoder();
    		CharsetEncoder utf8Encoder = Charset.forName("UTF-8").newEncoder();
     
    		String s = "éàü";
     
    		String utf8S = new String(utf8Encoder.encode(
    				CharBuffer.wrap(s.toCharArray())).array());
     
    		System.out.println(utf8S);
     
    		System.out.println(iso8859Encoder.canEncode(utf8S));
    Le code retourne true alors que la chaine est UTF-8.

  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
    Citation Envoyé par Tommy31 Voir le message
    Le code retourne true alors que la chaine est UTF-8.
    La chaine n'est pas en UTF-8 !!!

    En interne en Java toutes les Strings sont encodés en UTF-16 :
    A String represents a string in the UTF-16 format
    Tout comme les char/Character d'ailleurs :
    The Java 2 platform uses the UTF-16 representation in char arrays and in the String and StringBuffer classes

    Donc c'est une erreur de dire qu'une String utilise un encodage quelconque.






    Ce n'est que lors des opérations d'entrées/sorties que l'on utilise un encodage (conversion vers des bytes, fichiers, BD, ...), et là on a alors en fait une conversion UTF-16<->encodage désiré...




    Donc ici ta chaine "éàü" comporte trois caractères qui sont parfaitement encodable en iso-latin1...


    Maintenant si tu fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	String str = "1€";
     
    	CharsetEncoder encoder = Charset.forName("iso-8859-1").newEncoder();
    	boolean ok = encoder.canEncode(str);
    Tu obtiendras un joli "false" car le caractère "€" n'est pas représentable dans iso-8859-1...


    a++

  6. #6
    Membre Expert

    Homme Profil pro
    Architecte logiciel
    Inscrit en
    Novembre 2006
    Messages
    1 252
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Architecte logiciel
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 252
    Par défaut
    Mmm, tjs pas d'accord.

    Cette chaîne "éàü" lorsque je l'affecte à ma string est stockée selon un encodage utf-16. Ca d'accord.

    Mais lorsque j'écris ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    String utf8S = new String(utf8Encoder.encode(
    				CharBuffer.wrap(s.toCharArray())).array());
    Ma chaîne est encodé UTF-8, c'est à dire que les octets composant la chaîne se conforment au nouvel encodage. On peut s'en assurer en écrivant le train d'octet:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
                   for (Byte b : utf8S.getBytes()) {
    			System.out.println(b);
    		}
    Par contre pour ton code, ok. En fait la question portait sur savoir s'il y avait des caractères non encodables. Auquel cas ta solution est bonne

    Moi j'étais parti sur l'idée de savoir si la chaîne soumise était encodée en iso ou pas. Or lorsque la chaîne soumise est sous un encodage dont le jeu de caractère est un sous-ensemble de iso-8859-1, ta méthode ne le décelais pas.

    Bon bon, donc right answer...

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 11
    Par défaut
    Citation Envoyé par adiGuba Voir le message

    Maintenant si tu fais ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    	String str = "1€";
     
    	CharsetEncoder encoder = Charset.forName("iso-8859-1").newEncoder();
    	boolean ok = encoder.canEncode(str);
    Tu obtiendras un joli "false" car le caractère "€" n'est pas représentable dans iso-8859-1...


    a++
    En effet c'est ce qui se produit, cependant là est mon problème.

    Je me permet de ré-ouvrir le sujet après avoir parcouru le forum. Je cherche à envoyer un chaîne via ServletOutputStream, cependant un des caractère envoyé est un €, j'ai donc une exception qui apparaît :
    java.io.CharConversionException: € n'est pas un caractère ISO 8859-1

    J'ai fait en sorte que l'encodage soit en UTF-8.
    response.setCharacterEncoding("UTF-8");
    ServletOutputStream out = response.getOutputStream();

    Comment puis-je traiter ces caractères spéciaux ? (le € n'est qu'un exemple)

  8. #8
    Expert éminent

    Avatar de vermine
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    6 582
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 6 582
    Par défaut Merci
    Bonjour,

    Pardon de réouvrir le post mais je me devais de vous dire merci car cette réponse à résolu mon problème et Dieu sait comme on peut chercher dans le vague longtemps...




    Citation Envoyé par Tommy31 Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    		CharsetEncoder iso8859Encoder = Charset.forName("iso-8859-1")
    				.newEncoder();
    		CharsetEncoder utf8Encoder = Charset.forName("UTF-8").newEncoder();
     
    		String s = "éàü";
     
    		String utf8S = new String(utf8Encoder.encode(
    				CharBuffer.wrap(s.toCharArray())).array());
     
    		System.out.println(utf8S);
     
    		System.out.println(iso8859Encoder.canEncode(utf8S));

Discussions similaires

  1. Ma configuration est-elle compatible
    Par Roitiflamme dans le forum Windows 8
    Réponses: 4
    Dernier message: 07/01/2013, 20h37
  2. "string" est-elle de type char*
    Par yessine66 dans le forum C
    Réponses: 2
    Dernier message: 30/09/2010, 18h33
  3. Réponses: 6
    Dernier message: 31/10/2006, 10h55
  4. Réponses: 7
    Dernier message: 11/09/2006, 16h44
  5. La fonction fgets est-elle compatible Windows/Unix ?
    Par ashurai dans le forum Langage
    Réponses: 1
    Dernier message: 05/04/2006, 17h59

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