Table des caractères

cs_quicest Messages postés 32 Date d'inscription samedi 16 juillet 2005 Statut Membre Dernière intervention 17 avril 2013 - 30 juil. 2011 à 08:13
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 - 6 août 2011 à 23:31
bonjour,

quelque chose m'échappe !

int a;
for ( int l=0; l<32; l++ )
{	for ( int c=0; c<16; c++ )
{	a=c+(l*16);
Label lab=new Label();
lab.Top=(l+1)*20;	
lab.Left=(c+1)*20;
lab.Width=20;
lab.Height=20;

//---------- soit ----------
lab.Text=Encoding.Default.GetString( new byte[] { (byte)a } );		
// mais ne fonctionne que pour l<16 ( byte ! )
//---------- soit ----------
lab.Text=((char)a).ToString();
// mais ne fonctionne pas, au moins pour l=8+9, c=0 à 15
// par exemple l=8, c=0 ( caractère 128 ) = € normalement
//--------------------------

this.Controls.Add(lab);
}



comment fait-on ?
merci d'avance.

10 réponses

Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
30 juil. 2011 à 10:39
Bonjour,

peux tu être un peu plus précis,
la table que tu obtiens ne correspond pas à ce que tu attends ou ça bug?

As tu essayé
a++;
//a=c+(l*16);
?


Whismeril
0
cs_quicest Messages postés 32 Date d'inscription samedi 16 juillet 2005 Statut Membre Dernière intervention 17 avril 2013
30 juil. 2011 à 10:59
a++ ??? ça ne correspondrait absolument pas
à ce qu'il faudrait. c'est censé être le n°
du caractère à afficher.

si j'utilise :
lab.Text=Encoding.Default.GetString( new byte[] { (byte)a } );
on n'affiche pas les caractères au dessus de 255
( on ré-affiche les mêmes que ceux de 0 à 255,
normal me semble-t-il, à cause du "byte" utilisé,
mais peut-on faire autre chose ? )

si je fais :
lab.Text=((char)a).ToString();
les caractères au dessus de 255 sont corrects,
mais certains sont "mal affichés"
par exemple : de 128 à 143 ça "devrait être"
€ ? ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ  Ž 
or on ne voit que des "petits carrés"
0
cs_quicest Messages postés 32 Date d'inscription samedi 16 juillet 2005 Statut Membre Dernière intervention 17 avril 2013
30 juil. 2011 à 11:03
ah... les "& # xxx" sont dus à l'affichage du forum

€  ‚ ƒ „ … † ‡ ˆ ‰ Š ‹ Œ  Ž 

essai avec quote
0
cs_quicest Messages postés 32 Date d'inscription samedi 16 juillet 2005 Statut Membre Dernière intervention 17 avril 2013
30 juil. 2011 à 11:12
adresse copie écran :
http://cjoint.com/?3GEljPEGpFy

à gauche, ligne 9, des "petits carrés"
à droite, ligne 9 €..., ligne 17 et les suivantes
= ligne 1 et suivantes
c'est plus clair ?
0

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

Posez votre question
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
30 juil. 2011 à 11:15
Je ne te proposais pas d'afficher a++, mais de le calculer ainsi, car si a=c+(l*16); est inexact, peut être affiches tu € pour une valeur de 128 mais pas à la bonne place.
Les petits carrés correspondent normalement à des caractères non affichables,par exemple le retour chariot la tabulation.

Pour le byte je rejoins ton analyse.

Whismeril
0
cs_quicest Messages postés 32 Date d'inscription samedi 16 juillet 2005 Statut Membre Dernière intervention 17 avril 2013
30 juil. 2011 à 11:21
mais de le calculer ainsi
euh ???
a=c+(l*16); est inexact,
le calcul est correct à priori.
Les petits carrés correspondent à des caractères non affichables
Pour le byte je rejoins ton analyse.
et... je fais comment alors ?
merci de ton intervention.
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
30 juil. 2011 à 11:28
Chez moi, ça donne bien des carrés pour les lignes 9 et 10 mais pas pour le bas du tableau.


Whismeril
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
30 juil. 2011 à 11:38
J'ai essayé


//lab.Text=((char)a).ToString();
//---------- soit ----------
lab.Text=Convert.ToChar(a).ToString();
//---------- soit ----------
lab.Text=Convert.ToString(Convert.ToChar(a));


Mais c'est pareil.

Vu que le bas du tableau est lisible chez moi (VS express 2008 Framework 3.5), c'est peut être un problème de police des labels.
Je dois partir, j'ai éteint mon pc de développement, je ne peux donc pas tester ça de suite.

Si tu trouves, n'oublie pas de poster la solution et de la valider.

Whismeril
0
Whismeril Messages postés 19026 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 20 avril 2024 656
6 août 2011 à 00:10
Bonsoir

Chez moi char Toto = '€'; affecte 8364 a Toto. 128 semble bien être un petit carré.

Quand au bas du tableau pour lequel je lis des choses (pas sûr que ce soit celles que tu recherches...) la police de mes labels est MS Sans Serif taille en points 8.25.

En espérant t aider un peu.
Whismeril
0
cs_Robert33 Messages postés 834 Date d'inscription samedi 15 novembre 2008 Statut Membre Dernière intervention 14 janvier 2017 33
6 août 2011 à 23:31
Bonsoir

En fait tout vient du jeu de caractères utilisé.
Sur le jeu 8 bits, le € est 128, alors qu'en Unicode il est codé 8364.
Essaie :
	
System.Diagnostics.Debug.WriteLine(Encoding.Unicode.GetString(BitConverter.GetBytes(8364)));
System.Diagnostics.Debug.WriteLine(Encoding.Default.GetString(BitConverter.GetBytes(128)));

Et sur le jeu 8 bits, et bien il n'y a que 256 caractères possibles, hors 36 * 16 = 512,

Lorsque tu utilises
lab.Text=Encoding.Default.GetString( new byte[] { (byte)a } );

Cela revient à forcer le jeu de caractères 8 bits par défaut, qui doit être du Windows 125x
Essaie
lab.Text = Encoding.GetEncoding(1252).GetString(BitConverter.GetBytes(a));

Tu verras qu'à partir du code 256 (au delà du Byte) les caractères sont doublés, mais c'est le même jeu de caractères qui est utilisé.
Lorsque tu caste un int en byte "(byte)a" tu perds la partie haute de l'entier, en te retrouvant avec un modulo 256.

alors que quand tu utilises
lab.Text=((char)a).ToString(); 

Là tu passes en Unicode, et donc les caractères de 256 à 512 sont possibles.
Mais en Unicode, les caractères de 0 (\U0000) à 31 (\U001F) et de 128 (\U0080) à 159 (\U009F) sont considérés comme des codes de contrôle non affichables, ce qui explique les carrés à l'affichage.

Pour t'en convaincre, essaie
lab.Text = Encoding.Unicode.GetString(BitConverter.GetBytes(a));

cela donne la même chose que
lab.Text = ((char)a).ToString();




Bob.
C# is amazing, enjoy it!
0
Rejoignez-nous