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

Caml Discussion :

probleme : comparaison de chaine java/caml


Sujet :

Caml

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 8
    Points : 2
    Points
    2
    Par défaut probleme : comparaison de chaine java/caml
    Bonjour,
    je suis en train de développer un petite appli client (java) / serveur (caml)
    et j'ai besoin à un moment de comparer, dans le serveur, une chaine envoyée par le client :

    voici le bout de code :

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    //java :
     
    Socket sock = new Socket("localhost",12345);
    BufferedReader in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
    DataOutputStream out = new DataOutputStream(sock.getOutputStream());
     
               out.writeChars("tyty\n");
    	    String answer = in.readLine();
     
    	    if(Boolean.parseBoolean(answer)){
    	    	System.out.println("Ok !!!");
    	    }
    	    else{
    	    	System.out.println("PAS Ok !");
    	    }
     
     
    //caml :
     
    let s = "tyty" in
           let line = input_line inchan
           in
    	  print_endline ("recu : "^line);
    	  print_endline ("compare : "^s);
    	  if (compare "tyty" line) = 0 then output_string outchan ("true\n") else output_string outchan ("false\n");
    	  flush outchan
    voila, le seveur recois bien la bonne chaine dans le serveur, à laffichage j'ai la meme chose mais le compare ne me rend pas 0 donc le serveur envoie toujours la chaine "false"

    je vois pas d'ou ca peut venir
    j'espere que quelqu'un aura une solution

    Merci

  2. #2
    alex_pi
    Invité(e)
    Par défaut
    Demande la longueur de "line". Si c'est 8, tu as un problème d'unicode.

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Merci pour t'a réponse

    c'est la conclusion a laquelle je suis arrivé aussi, je vais quand même tester la longueur de la chaine reçu.
    Mais si c'est vraiment ça le problème qu'est ce que je doit faire pour y remédier et enfin pouvoir comparer mes chaines ?

  4. #4
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    fait 2 compares, un avec l'iso8859-1 et un avec l'utf-8

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2005
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    merci,

    Caml c'est pas vraiment mon langage de prédilection tu saurais pas comment faire exactement pour effectuer ces 2 compares ?

  6. #6
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    Citation Envoyé par turnoom Voir le message
    fait 2 compares, un avec l'iso8859-1 et un avec l'utf-8
    D'après l'exemple, la chaîne testée est "tyty", ce qui est encodé de la même façon avec ces deux charsets. J'ai fait une recherche rapide, il semblerait que Java utilise l'utf-16 et utilise 2 octets par caractère (comme alex_pi a indiqué). Je te conseille de convertir ta chaîne côté Java (il semble que ce soit la méthode getBytes de String).

  7. #7
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    par faire 2 compare's je pensais à ça,
    imaginons que tu ne saches pas quel est l'encodage de la chaine en entrée str_in et que tu veilles la comparer à une chaine donnée my_str, et bien tu prépares plusieurs version de la chaine my_str dans les différents encodages possibles, par exemple my_str_iso88591, my_str_utf16, etc...
    y'a juste alors a faire comme suit :

    Code ocaml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    match Pervasives.compare in_str my_str_iso88591,
          Pervasives.compare in_str my_str_utf16 with
    | 0, _
    | _, 0 -> (* au moins l'une des deux à matché *)
    | _, _ -> (* ça matche pas *)

    Mais LLB a raison, l'idéal c'est quand même de connaitre quel est l'encodage utilisé et de bosser avec celui-ci.

  8. #8
    LLB
    LLB est déconnecté
    Membre expérimenté
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Points : 1 412
    Points
    1 412
    Par défaut
    Au fait... c'est plus simple d'utiliser '=' que de comparer la valeur de retour de compare avec 0.

    L'exemple devient donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if in_str = my_str_iso88591 || in_str = my_str_utf16 then ...
    Si on a beaucoup d'encodages, on peut aussi les mettre dans une liste et utiliser List.mem.

  9. #9
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    c'est très juste, les conseils de LLB sont très judicieux,
    si tu n'es vraiement pas familiarisé avec ocaml et la prog functionnelle, par exemple un truc que tu peux faire est mettre toutes tes fonctions de conversion d'encodage dans une liste, tu map cette liste pour avoir les chaines à comparer, lequel résultat peut alors être passé tel-que à List.mem :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # List.mem ;;
    - : 'a -> 'a list -> bool = <fun>
    par exemple avec des fonctions avec ce type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    val conv_utf16 : string -> string
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    let comp_base = List.map (fun conv_fun -> conv_fun my_str) [conv_utf16; conv_utf8; conv_isoX] in
    if List.mem in_str comp_base
    then (* ca matche *)
    else (* ca matche pas *);
    utiliser des fonctions comme paramètres, dans des structures, appliquées partiellement, existe aussi dans d'autres paradigmes, mais en fonctionnel c'est extrèmement courant.

  10. #10
    alex_pi
    Invité(e)
    Par défaut
    Euh, turnoom, tu penses vraiment que le meilleur moyen de définir un protocole de communication entre deux programmes est d'envisager que chacune des applis peut encoder ses chaines dans tous les formats possibles ? Parce qu'il y a aussi l'UTF8, tous les formats ISO-machin, etc.

    Le plus simple serait quand même de s'assurer que les deux cotés parlent la même langue...

  11. #11
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Points : 9
    Points
    9
    Par défaut
    Citation Envoyé par turnoom Voir le message
    Mais LLB a raison, l'idéal c'est quand même de connaitre quel est l'encodage utilisé et de bosser avec celui-ci.

Discussions similaires

  1. Comparaison deux chaine de caractère arabe en java
    Par vetchang dans le forum Général Java
    Réponses: 9
    Dernier message: 08/10/2007, 23h53
  2. probleme de comparaison de chaines
    Par yous18 dans le forum Débuter
    Réponses: 10
    Dernier message: 20/09/2007, 13h53
  3. probleme comparaison d une partie d une chaine
    Par sneb5757 dans le forum PostgreSQL
    Réponses: 12
    Dernier message: 03/01/2006, 09h08
  4. [LG]comparaison de chaines de caracteres
    Par thesam dans le forum Langage
    Réponses: 6
    Dernier message: 20/05/2003, 22h41
  5. Probleme sur les chaines de caractere
    Par scorpiwolf dans le forum C
    Réponses: 8
    Dernier message: 06/05/2002, 19h01

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