JTextField et ASCII

Résolu
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 - 28 nov. 2010 à 22:52
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 - 1 déc. 2010 à 22:07
Bonjour à tous ! (:

Ca commence à faire un bout de temps que je cherche, je cherche, et je cherche encore sans rien trouver de concret ..

Avec les JTextField, il est possible de saisir des caractere spéciaux, en utilisant la touche ALT suivit d'un code numérique. En revanche, il semblerait que (nativement, ou avec ma configuration actuelle en tout cas) l'on ne puisse pas récupérer ces caractères lorsque l'on fait un "getText();"

Par exemple, dans mon JTextField, j'entre la chaine suivante "cd↔./". Le caractère "↔" correspond au code 29 de la table ascii (GroupSeparator). La chaine s'affiche correctement dans la zone de saisie.

Lorsque je fait un appel à la fonction "getText()", les caractère spéciaux ont été remplacé par des "?". Je me suis d'abord, dis que cela vennait de l'affichage. Mais en récupérant les code ascii des caractères, j'ai remarqué qu'à la place des 29, 30, et 31 j'ai des 63 (ce qui correspond au code ascii du "?").

Est ce que vous auriez une idée de comment ce "bug" peut-être corrigé ?
Merci à tous par avance !

15 réponses

didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
1 déc. 2010 à 22:03
Bonsoir !

Après avoir lu ce rapport de bug de SUN, j'ai décidé d'arrêter de me prendre la tête (pour le moment).

J'ai donc "solutionné" ce problème en ajoutant un bouton qui permet d'ajouter directement le caractère voulu à la position du caret du JTextField. Pour conserver la facilité d'utilisation, un racourcis clavier (tel que F1) permet d'ajouter le caractère directement.

Merci de ton aide ! (:
3
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
1 déc. 2010 à 22:07
Je rajoute une note sur le post concernant la modification du charset. J'y suis parvenu en faisant un :

java -Dfile.encoding=ASCII -jar MyJar.jar

Mais même en essayant différents charset (dont le Cp850) ca n'a pas solutionné ma question..
3
Utilisateur anonyme
29 nov. 2010 à 14:57
Salut,

Tu sais quelle est la table ASCII active qui correspond à la config de ton système?

Pour le savoir, ouvre MSDOS et entre chcp.

Pour que certains caractères spéciaux tels que les caractères accentués, et par exemple 'GS' s'affichent correctement, il faudrait que ce soit la table 850 (Cp850).

La petite méthode suivante permet d'afficher correctement sans modifier la config...

public static void affichAccents(String affich)
      {
         try
         {
            //  sortie à la console MSDOS avec les caractères accentués
            w = new BufferedWriter
                  (new OutputStreamWriter(System.out, "Cp850"));
            w.write(affich);
            w.flush();  
         }
            catch (Exception e)
            {
               e.printStackTrace();
            }
            
               //w.close(); Doit etre faite après le dernier affichage possible
               //comme ceci:
            
         /*try
         {
            w.close();
         }
             catch (Exception e)
            {
               e.printStackTrace();
            }*/
         
      }


Le caractère de contrôle GS (une petite flèche horizontale à double pointe genre <->) a pour valeur hexa '1D' j'ai testé comme ceci:

String gs = "\u001D"; // UNICODE
         affichAccents("\nGS correspond au caractère " + gs + "\n");


et c'est ok...

J'espère que ça te conviendra.

Cordialement,

...\ Dan /...
0
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
29 nov. 2010 à 19:24
Salut,

Merci de ta réponse. J'ai essayé et, effectivement, les caractères spéciaux sont bien affichés.

Cependant, mon problème réside dans le stockage des données saisies dans un JTextField. Où les caractères spéciaux ont été remplacés, en dure (donc pas seulement à l'affichage), par des "?".

Si vous avez d'autres propositions, je suis preneur (:
Merci de votre aide !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
30 nov. 2010 à 00:34
Re,

Les caractères ne sont pas modifiés, ils sont interprétés par la JVM à l'aide de la table ASCII active (tu ne m'a pas indiqué quelle est cette table mais on sait que ce n'est pas la 850) et si la table active ne compte pas le caractère à afficher à la console MSDOS comme "imprimable", elle affiche tout bonnement un ?, sauf si on utilise la méthode proposée ci-dessus qui ne modifie rien de la config à la place de System.out.print...

L'inconvénient, c'est que ne disposant plus de print ou println on doit gérer les éventuels saut de ligne en utilisant \n ou mieux:

nL1 = System.getProperty("line.separator");
         nL2 = nL1;
         nL2 = nL2.concat(nL1);
         .....
         .....
// par exemple

String gs = "\u001D"; // UNICODE
affichAccents(nL1 + "GS correspond au caractère " + gs + nL2 + nL1);


J'ai oublié de préciser qu'il faut déclarer w, en variable de classe:

      
      // pour la méthode static AffichAccents()
      private static Writer w;


puisqu'elle est utilisée aussi en fin de méthode main(...) pour le close.

\ Dan /...
0
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
30 nov. 2010 à 08:17
Salut,

La table active est, si je me souviens bien, la table 437.

Je ne compte pas vraiment afficher ces caractères dans la console, mais plutot les envoyer (par Socket) ou les afficher dans un autre composant graphique de javax.swing

D'après ce que tu me dis, c'est l'interprétation de la JVM qui me cause ces "?". Je vais donc voir si il est possible de changer le Charset par défaut de mon application (seulement).

Merci, je te tiens au courant dès ce soir ..
0
Utilisateur anonyme
30 nov. 2010 à 10:46
// avec la table 437 (ou d'ailleurs quelle que soit la table) et &#8596;
        // gs2 s'afficherait correctement par exemple dans une boîte de dialogue:
         String gs2 =  "<HTML> &#8596; </HTML>"; // le contenu du JTextField
        
         JOptionPane.showOptionDialog(null, gs2, "ON AFFICHE BIEN GS2",
               JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE, null, null, null);


...\ Dan /...
0
Utilisateur anonyme
30 nov. 2010 à 11:31
Plus exactement:
String valeurSaisie =  "<HTML> cd&#8596; </HTML>"; // le contenu du JTextField
      			
JOptionPane.showOptionDialog(null, valeurSaisie, "ON AFFICHE CORRECTEMENT",
JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);



...\ Dan /...
0
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
30 nov. 2010 à 17:20
Salut,

L'affichage (dans les composants graphique) au sein même de l'application se fait correctement.

Lorsque je rentre dans le JTextField nommé "myField" le caractère GS, et que j'exécute ce code, j'obtient "8596" sur la sortie standard.
String data = myField.getText();
for (int a=0; a<data.length(); a++)
System.out.println((int)data.charAt(a));


Je demande à savoir quel est le charset actif et j'obtien "null" ! Il n'y a pas un soucis !? Du coup je défini le nouveau charset comme étant "Cp850". Je re-exécute le programme mais le code de "<->" est toujours le même..

Est ce qu'il y a quelque chose que je ne fais pas correctement ? Ou alors est ce que tout est bon, et c'est la manière dont j'interpréte les caractères qui n'est pas bonne ?
0
Utilisateur anonyme
30 nov. 2010 à 20:08
Je pense qu'il faudrait récapituler.

Peux-tu m'indiquer ce que tu dois saisir exactement ?

Avec le cas GS

- "GS"
- "cdGS"
- "cd↔"
- autre ?

et ce que tu dois transmettre:

- est-ce par exemple cd<-> ?

Il y a d'autres cas que "GS" ?

...\ Dan /...
0
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
30 nov. 2010 à 20:48
Récapitulons ! (:

Je souhaite envoyer, par le biais de java.net.Socket, des commandes.

Ces commandes n'ont pas de syntaxe particulière. Le caractère GS permet de séparer une commande et ses différents paramètres.

Exemple :
- display(GS)Le texte avec espace(GS)Le titre(GS)Boutons
- etc.

J'ai choisi le GS (29) parce qu'il ne s'agit pas d'un caractère "habituel".

Les commandes sont saisies grace à un JTextField.

Le problème :
- Lorsque je récupère le texte contenu dans le champ, le caractère GS a été remplacé par un "?"

Ce que j'ai essayé pour le résoudre :
- Changer le charset par défaut
- utiliser FS et US à la place de GS
- et c'est tout, parceque le remplacement est effectué avant que je ne récupère le texte avec la méthode "getText();"
0
Utilisateur anonyme
1 déc. 2010 à 03:22
Tout d'abord peux tu me dire ce que tu obtiens en saisissant + <029>

En attendant ta réponse voici un petit code qui te permettrait d'obtenir les paramètres séparés par des '<->'.

C'est une bidouille mais bon...
String message = ""; // le message à envoyer obtenu par getText()
         int valDeci  = 29; // la valeur décimale de GS
         String separateur = new Character((char)valDeci).toString(); // soit <->
         // on doit saisir par exemple et à condition que '|' n'existe JAMAIS dans les paramètres:
         // display|Le texte avec espace |Le titre|Boutons
         // String message = getText()... nous donne la saisie soit:
         message = "display|Le texte avec espace |Le titre|Boutons";
         message = message.replaceAll("\\|", separateur);
         System.out.println("Le message: " + message + "\n");
      
         Pattern pattern = Pattern.compile(separateur); // import java.util.regex.Pattern;
         String[] parametres = pattern.split(message);
         for(int i = 0; i < parametres.length; i++)
         System.out.println("param " + (i+1) + ":  " + parametres[i]);


Mais alors pourquoi ne pas utiliser directement le séparateur '|' ?
Juste pour voir que c'est possible.

...\ Dan /...
0
Utilisateur anonyme
1 déc. 2010 à 05:05
Ou bien (mais cela dépend de ce que tu obtiens avec + <029>):

Attention, ce qu'on a entre un paramètre et un autre ce n'est pas un espace mais + <029> qui n'est pas affiché par l'éditeur de CodeS-SourceS mais qui devrait l'être après un copier-coller sur ton edi.

Même chose pour String separateur = "";

String message = "displayLe texte avec espace Le titreBoutons";
         System.out.println("Le message: " + message + "\n");
         String separateur = ""; // obtenu avec  + <029>
         
         Pattern pattern = Pattern.compile(separateur); // import java.util.regex.Pattern;
         String[] parametres = pattern.split(message);
         for(int i = 0; i < parametres.length; i++)
            System.out.println("param " + (i+1) + ":  " + parametres[i]);


// Mais alors quelle saisie à ne pas mettre entre toutes les mains:
//saisir: diaplay suivi de + <029> puis Le texte avec espace suivi de + <029>
//puis Le titre suivi de + <029> et enfin Boutons.
// Ou peut-être en spécialisant une touche clavier non utilisée par ailleurs avec + <029> (jamais utilisé )

...\ Dan /...
0
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
1 déc. 2010 à 13:35
Salut,

J'ai déjà codé toutes les fonctions d'analyse, et d'exécution des commandes (en C). Ces fonctions sont terminées et fonctionnelles. Java n'a plus qu'à envoyées les commandes.

J'ai préféré éviter utiliser un caractère accessible directement par une touche du clavier (donc |, ~, -, etc.) car ce sont des caractères qui peuvent faire partie de la commande en tant que paramètre et non en tant que séparateur.

Mais on s'éloigne de la question de départ..

Lorsque je saisie + 29 j'obtien le caractère GS (à savoir la double fleche <->) dans la zone de saisie.

Comment récupérer les caractères tels qu'ils ont été saisis dans le champ du JTextField ? J'entend par là, que les caractères spéciaux ne soient pas remplacés par des "?"..
0
didoux95 Messages postés 845 Date d'inscription mardi 25 avril 2006 Statut Membre Dernière intervention 1 août 2017 2
1 déc. 2010 à 16:35
J'ai du nouveau :

Lorsque je place un caractère dans la zone de saisie, en utilisant setText("\u001D") ou setText(((char)29)+""), et que je récupére le code ascii des caractères contenu dans le champ, j'obtien bien 29.

Par contre, les caractères affichés ne sont plus lisibles. C'est-à-dire qu'il s'affiche un petit carré à la place du caratère habituellement associé (dans mon cas "<->").

Du coup, je pense que cela vien de l'encodage des caractères au sein de l'application, et, comme tu me l'as dis, de la JVM. Parce que je trouve étrange qu'un même caractère, suivant qu'on le "tape" (utilisateur) ou qu'on l'insère (application), n'ai pas la même représentation et ne soit pas interprété de la même manière.

Je ne parviens pas à changer le Charset de l'application en faisant :
System.setProperty("file.encoding", "US-ASCII");
// System.setProperty("file.encoding", "UTF-8");

Je n'agis peut-être pas sur le bon paramètre .. (?)

Si tu as de nouvelles suggestions, je suis preneur ! (:
0
Rejoignez-nous