Code ascii etendus

cs_zame Messages postés 85 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 20 février 2006 - 9 déc. 2004 à 15:12
cs_zame Messages postés 85 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 20 février 2006 - 12 déc. 2004 à 19:36
Bonjour j'ai déja cherché sur le site mais je n'ai rien trouvé malgrés les reponses deja proposees.

Je dois mettre dans un char le caractere CARRE ou similaire mais je ne trouve pas le code.Je sais mette un "u e .." avec accents,

Mais pour les caracteres "speciaux" etendus, je cru lire que certains utilisais les carrés pour les bord en console .

Je pense qu'il faut specifier au compilo le jeu de caractere etendu mais je n'ai pas trouvé.

et la syntaxe utilisée est elle la meme que pour les éè... "\202".. ?
Puisque dans la table de caractere de windows le carré n'a pas de alt+... , mais une valeur unicode.

Je travaille sous win32.

Merci pour toutes aides.

39 réponses

cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
10 déc. 2004 à 17:57
Bizarre, la solution d'aardman fonctionne très bien chez moi (et sur mes deux compilateurs). Tu as quelle version de MSVC ?
0
cs_zame Messages postés 85 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 20 février 2006
10 déc. 2004 à 18:11
Visual Studio 6, faut 'il declarer quelque chose , puisque là je suis larger.

win32 pas MFC.
0
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
10 déc. 2004 à 19:07
Ben je te donne le code que j'utilise :

#define UNICODE
#include <windows.h>

INT main(VOID) {
TCHAR szMsg[] = TEXT("%askolnikov");
szMsg[0] = 0x042F;
MessageBox(NULL, szMsg, NULL, 0);

MessageBox(NULL, TEXT("\x042F") TEXT("askolnikov"), NULL, 0);

return 0;
}

Par contre j'ai MSVC 2003 :-/
0
cs_zame Messages postés 85 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 20 février 2006
10 déc. 2004 à 19:27
TCHAR szMsg[] = TEXT("%askolnikov");
szMsg[0] = 0x042F;
MessageBox(NULL, szMsg, NULL, 0);

là : szMsg = "/askolnikov"

MessageBox(NULL, TEXT("\x042F") TEXT("askolnikov"), NULL, 0);
là : error C2022: '1071' : too big for character.

Je vais compiler ça dans un projet tous propre apres on verra si il y a toujours les meme erreur.

Peut t'il y avoir des conflit avec d'autres lib standard?
0

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

Posez votre question
cs_Nebula Messages postés 787 Date d'inscription samedi 8 juin 2002 Statut Membre Dernière intervention 7 juin 2007 2
10 déc. 2004 à 19:59
Je le compile ainsi : cl /W3 /Tc main.c user32.lib
Et aucune erreur ni warning sur la taille du caractère Unicode, ni sur la chaine avec le %.

M'est avis que c'est VC6 qui déconne, faudrait regarder sur MSDN. J'ai pas VC6, donc je peux pas reproduire :-/
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
10 déc. 2004 à 21:53
Salut,
Je viens de tester l'exemple de Nebula sur VC6, ça compile et marche sans problème. Ca affiche bien "?askolnikov". La différence d'affichage peut s'expliquer par la police choisie.
Pour les caractères que tu cherches, ils ne se trouvent que dans 3 polices: Arial, Courier New et Times New Roman. Le carré plein a pour code 0x2588. Voici un exemple qui l'affiche dans un STATIC:
#define UNICODE
//.....
HWND hStatic=CreateWindow(TEXT("STATIC"),......
HFONT hFont;
hFont=CreateFont(16,0,0,0,0,0,0,0,0,0,0,0,0,TEXT("Arial"));
SendMessage(hStatic,WM_SETFONT,(WPARAM)hFont,1);
TCHAR str[2];
str[0]=0x2588;
str[1]=0;
SetWindowText(hStatic,str);
//.....

Pour les codes des autres caractères, tu les trouveras dans "La Table Des Caractères" des outils système.
0
cs_zame Messages postés 85 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 20 février 2006
10 déc. 2004 à 21:58
tant que l'hexa commence par 00 ça marche, apres plus rien.

Sinon que me conseiller vous pour programmer.
MSVC 2003 je suppose que c'est visual studio net , non?
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
10 déc. 2004 à 22:16
Désolé pour le "?" dans la chaine. Je voulais écrire un "R" renversé mais j'arrive pas à le faire passer ici.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
10 déc. 2004 à 22:25
Tu n'as pas oublié d'ajouter #define UNICODE au début du code?
Je pense que c'est là l'origine de ton erreur.
"error C2022: '1071' : too big for character" signifie que le nombre 1071 ne peut pas tenir dans un dans char. Quand le mode UNICODE est bien défini, le TCHAR sera de 16 bits et pourra donc contenir les valeurs plus grandes que 255.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
10 déc. 2004 à 22:54
Ce que je peux te conseiller, c'est de ne jamais incriminer ton compilateur. Il faut toujours penser à des erreurs dans le code. J'utilise Visual C++ 6 depuis des années et j'en suis très satisfait. Je me demande d'ailleurs pourquoi je passerai à une version plus récente.
Tu as essayé mon exemple? Je suis sûr que cela correspond exactement à ce que tu cherches.
0
cs_zame Messages postés 85 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 20 février 2006
11 déc. 2004 à 11:30
Je n'incrimine pas le compilateur.
Je fais un plugin pour une appli qui elle definie la font arial pour l'affichage. Je dois absolument lui faire passe le un char pour l'affichage.Comment faire la conversion.

Et si je met arial dans windows pour les boites de dialogues, sa devrai marcher?

TCHAR str[2];
str[0]=0x2588;
str[1]=0;

str : Me donne ^.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
11 déc. 2004 à 20:24
Salut,
S'il t'affiche "^", cela veut dire que tu n'es pas en mode UNICODE car 0x2588 est transformé par le compilateur en 0x88. Tu dois avoir reçu un Warning du genre: truncation from 'const int' to 'char'. Pour être sûr que ton programme tourne en UNICODE, il suffit d'insérer la ligne de code suivante pour obtenir la taille du TCHAR :
int taille=sizeof(TCHAR);

Si taille = 2 alors tu es en UNICODE
Si taille = 1 alors tu es en ANSI

Si tu veux absolument travailler en ANSI (char), j'essaierai de te faire un petit exemple après l'avoir testé.
Tu as quelle version de Windows?
0
cs_zame Messages postés 85 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 20 février 2006
11 déc. 2004 à 21:04
Je suis sous XP et malgres le #define UNICODE ton test renvoi 1.
Merci de te pencher dessus.
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
12 déc. 2004 à 05:12
Nomalement XP supporte le mode UNICODE. Puisque le test te revoie 1, ça veut dire que ton programme tourne en mode ANSI. L'erreur est sans doute quelque part dans le code.
Si tu préfères rester en mode ANSI, voici des polices qui contiennent chacune pas moins de 200 symboles:
-Symbol
-Webdings
-Wingdings
-Wingdings 2
-Wingdings 3
Tu peux les explorer grâce à la table de caractères pour trouver tous les symboles dont tu as besoin. Le carré plein se trouve dans la police Webdings sous le code 0x67 :
//.....
HWND hStatic=CreateWindow(STATIC,......
HFONT hFont;
hFont=CreateFont(18,0,0,0,0,0,0,0,SYMBOL_CHARSET,0,0,0,0,"Webdings");
SendMessage(hStatic,WM_SETFONT,(WPARAM)hFont,1);
char str[2];
str[0]=0x67;
str[1]=0;
SetWindowText(hStatic,str);
//.....

Voilà. J'espère que ça aidera.
0
cs_zame Messages postés 85 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 20 février 2006
12 déc. 2004 à 11:23
J'ai essayé dans un projet propre et juste le code que tu me donne et #define UNICODE en entete , et rien il reste en ansi.

je n'ai pas le choix de la police , sa doit etre Arial , je formatte les données et les envoient à l'appli qui elle les affichent.

Je sais pas ou est le probleme , apparament ça marche chez tous le monde .
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
12 déc. 2004 à 15:09
Salut,
Tu peux mettre ton code ici? J'aimerais bien le tester chez moi pour essayer de trouver l'origine du problème.
0
cs_zame Messages postés 85 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 20 février 2006
12 déc. 2004 à 15:23
ça va etre trop long.

Je fais un nouveau projet -> MFC application wizard -> dialogue based. en exemple .

en entete je met #define UNICODE.

je crée un nouveau bouton qui aura pour fonction le test de savoir si il est passé en unicode.

void CTestdialogueetenduDlg::OnButton1()
{

int taille=sizeof(TCHAR);

if (taille==2) MessageBox( "unicode", NULL, 0);
if (taille==1) MessageBox( "ansi", NULL, 0);

TCHAR str[2];
str[0]=0x2588;
str[1]=0;

MessageBox( str, NULL, 0); //-> str = ^
}
0
racpp Messages postés 1909 Date d'inscription vendredi 18 juin 2004 Statut Modérateur Dernière intervention 14 novembre 2014 17
12 déc. 2004 à 19:12
Je pensais que tu travaillais en API. Je n'utilise pas MFC mais je pense qu'il faut changer les propriétés du projet pour activer le mode UNICODE (#define UNICODE ne suffit pas en MFC). Je ne sais pas comment tu dois faire exactement mais je suis sûr que tu y arriveras. Tu peux aussi poster une nouvelle question sur le forum du genre :"Comment activer UNICODE en MFC?".
Une fois, le mode UNICODE activé, ton problème sera réglé.
Bonne programmation.
0
cs_zame Messages postés 85 Date d'inscription jeudi 27 mai 2004 Statut Membre Dernière intervention 20 février 2006
12 déc. 2004 à 19:36
Je vais essayer en api ,
de toute façon je dois le faire en api.
merci @+
0
Rejoignez-nous