 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
giova Guest
|
Posted: Tue Apr 06, 2004 4:17 pm Post subject: Comment faire la definition d'une chaine de caractere WCHAR? |
|
|
Bonjour.
Je dois utiliser gdiplus.dll
la fonction a utiliser est : Bitmap(WCHAR*,BOOL)
je suis debutant je n'ai jamais travaillé avec le type WCHAR, plutot habitué
aux string . comment manipule t'on ce type? que faut il inclure pour pouvoir
l'utiliser?
je vous remercie d'avance pour votre aide.
|
|
| Back to top |
|
 |
Arnaud Debaene Guest
|
Posted: Tue Apr 06, 2004 9:54 pm Post subject: Re: Comment faire la definition d'une chaine de caractere WC |
|
|
giova wrote:
| Quote: | Bonjour.
Je dois utiliser gdiplus.dll
la fonction a utiliser est : Bitmap(WCHAR*,BOOL)
je suis debutant je n'ai jamais travaillé avec le type WCHAR, plutot
habitué aux string . comment manipule t'on ce type?
WCHAR = une macro pour wchar_t, un caractère large (Unicode). Codé sur 16 |
bits sous Windows, pls sur cetaines plates-formes.
| Quote: | que faut il
inclure pour pouvoir l'utiliser?
rien du tout, wchar_t est un type primitif. Utilises std::wstring (#include |
<string>) pour te simplifier la gestion de ces chaînes. et
std::wstring::c_str() pour obtenir le wchar_t correspondant à la chaine.
Arnaud
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Wed Apr 07, 2004 12:02 am Post subject: Re: Comment faire la definition d'une chaine de caractere WC |
|
|
On Tue, 6 Apr 2004 23:54:41 +0200, "Arnaud Debaene"
<adebaene (AT) club-internet (DOT) fr> wrote:
| Quote: | que faut il
inclure pour pouvoir l'utiliser?
rien du tout, wchar_t est un type primitif. Utilises std::wstring (#include
string>) pour te simplifier la gestion de ces chaînes. et
std::wstring::c_str() pour obtenir le wchar_t correspondant à la chaine.
|
c_str() renvoie un "wchar_t const*", non convertible en un "wchar_t" a
priori.
De deux choses l'une :
- soit la fonction ne modifie pas la chaîne, et tu peux utiliser
const_cast<> avec force commentaires
- soit la fonction modifie effectivement la chaîne, auquel cas
tu dois connaître à l'avance la taille maximale de la chaîne. Et
std::vector<wchar_t> me paraît le conteneur le plus approprié.
Exemple [non portable] (avec char, mais le principe est le même avec
wchar_t) :
std::vector <char> buf (MAXDIR); // MAXDIR est la limite telle
que définie par mon compilo
if (getcurdir (drive, &(buf[0])) != 0)
{ Panique ("Y'a un blème !");
}
else
{
std::string nom_repertoire (buf.begin());
...
}
--
;-)
|
|
| Back to top |
|
 |
giova Guest
|
Posted: Wed Apr 07, 2004 9:54 am Post subject: Re: Comment faire la definition d'une chaine de caractere WC |
|
|
J'ai rencontre encore beaucoup de mal manipuler ce type.
mon constructeur : Bitmap(WCHAR*,BOOL)
attend un WCHAR* qui en fait represente le nom du fichier a ouvrir. je
souhaite faire une classe avec un attribut de ce type, voir de type string
avec une fonction WCHAR* GetString(void)
Lorsque j'appelle le constructeurBitmap(WCHAR*,BOOL) le compilateur me jete
me disant que le premier parametre de type std::wstring ne peut etre
converti en WCHAR*
j'avoue ne pas trop m'y retrouver dans les doc msdn pour retrouver toutes
les fonctions de wchar, et ainsi trouver comment convertir un wstring en
WCHAR*
"Fabien LE LEZ" <gramster (AT) gramster (DOT) com> a écrit dans le message de
news:kqg6705k7kvr1pbnq76pv7b0u8s4sdii8u (AT) 4ax (DOT) com...
| Quote: | On Tue, 6 Apr 2004 23:54:41 +0200, "Arnaud Debaene"
[email]adebaene (AT) club-internet (DOT) fr[/email]> wrote:
que faut il
inclure pour pouvoir l'utiliser?
rien du tout, wchar_t est un type primitif. Utilises std::wstring
(#include
string>) pour te simplifier la gestion de ces chaînes. et
std::wstring::c_str() pour obtenir le wchar_t correspondant à la chaine.
c_str() renvoie un "wchar_t const*", non convertible en un "wchar_t" a
priori.
De deux choses l'une :
- soit la fonction ne modifie pas la chaîne, et tu peux utiliser
const_cast<> avec force commentaires
- soit la fonction modifie effectivement la chaîne, auquel cas
tu dois connaître à l'avance la taille maximale de la chaîne. Et
std::vector<wchar_t> me paraît le conteneur le plus approprié.
Exemple [non portable] (avec char, mais le principe est le même avec
wchar_t) :
std::vector <char> buf (MAXDIR); // MAXDIR est la limite telle
que définie par mon compilo
if (getcurdir (drive, &(buf[0])) != 0)
{ Panique ("Y'a un blème !");
}
else
{
std::string nom_repertoire (buf.begin());
...
}
--
|
|
|
| Back to top |
|
 |
Martinez Jerome Guest
|
Posted: Thu Apr 08, 2004 8:34 am Post subject: Re: Comment faire la definition d'une chaine de caractere WC |
|
|
giova wrote:
| Quote: | Lorsque j'appelle le constructeurBitmap(WCHAR*,BOOL) le compilateur me jete
me disant que le premier parametre de type std::wstring ne peut etre
converti en WCHAR*
j'avoue ne pas trop m'y retrouver dans les doc msdn pour retrouver toutes
les fonctions de wchar, et ainsi trouver comment convertir un wstring en
WCHAR*
|
comme dit précédement :
wstring::c_str() pour avoir la version "a la C" qu'aime Windows (l'API
est en C, pas C++).
Il te donnera le const wchar* que tu cherches.
wchar_t n'a pas de fonction, c'est un type de base comme char, int etc...
wchar_t est le pendant UNICODE de char, a manipuler comme char.
Tu disposes dans l'API windows d'outils de conversion char (que tu
recuperes de certaines fonctions windows) en wchar_t. Me rappelle plus
le nom, voir le newsgroup adapté.
Remarque : pour ecrire dans le code un nom de fichier, utiliser :
std::string Ansi="C:\a.txt"; //version ansi, habituelle
std::wstring Unicode=L"C:\a.txt"; //version unicode
|
|
| Back to top |
|
 |
Arnaud Meurgues Guest
|
Posted: Thu Apr 08, 2004 1:56 pm Post subject: Re: Comment faire la definition d'une chaine de caractere WC |
|
|
Martinez Jerome wrote:
| Quote: | wchar_t est le pendant UNICODE de char, a manipuler comme char.
|
Je ne suis pas sûr qu'on puisse considérer que wchar_t soit unicode.
D'abord parce qu'unicode, ce n'est pas une représentation, c'est un
mapping entre un nombre et un caractère. On peut très bien représenter
de l'unicode dans des char si l'on utilise l'UTF8.
Ensuite, parce que la norme n'impose rien sur le format de wchar_t.
On pourrait espérer, afin de supporte l'UTF32 (qui pourrait être
considéré comme la représentation la plus naturelle d'unicode) que soit
demandé à wchar_t d'avoir au moins 32 bits. Mais ce n'est pas le cas. Si
je ne me trompe pas, wchar_t peut même être un typedef de char.
--
Arnaud
(Supprimez les geneurs pour me répondre)
|
|
| Back to top |
|
 |
kanze@gabi-soft.fr Guest
|
Posted: Tue Apr 13, 2004 10:30 am Post subject: Re: Comment faire la definition d'une chaine de caractere WC |
|
|
Arnaud Meurgues <arnaud (AT) meurgues (DOT) non.fr.invalid> wrote
| Quote: | Martinez Jerome wrote:
wchar_t est le pendant UNICODE de char, a manipuler comme char.
Je ne suis pas sûr qu'on puisse considérer que wchar_t soit unicode.
|
En général, certainement pas. La norme C++ n'en exige rien.
Dans la pratique, je crois qu'aujourd'hui, si une implémentation
supporte bien un type de caractère plus large (c-à-d un wchar_t qui est
différent de char), et c'est le cas des implémentations courantes, on
est en droit à s'attendre à ce que son encodage soit basé sur l'Unicode.
Qualité de l'implémentation exige.
| Quote: | D'abord parce qu'unicode, ce n'est pas une représentation, c'est un
mapping entre un nombre et un caractère. On peut très bien représenter
de l'unicode dans des char si l'on utilise l'UTF8.
|
Ou UTF-16:-).
| Quote: | Ensuite, parce que la norme n'impose rien sur le format de wchar_t.
On pourrait espérer, afin de supporte l'UTF32 (qui pourrait être
considéré comme la représentation la plus naturelle d'unicode) que
soit demandé à wchar_t d'avoir au moins 32 bits.
|
Si on commençait de rien, et qu'on n'avait aucun contraint de
l'existant, c'est sûr que la solution « idéale » serait UCS-4 en
interne, et UTF-8 en externe. L'intention du comité, c'est bien qu'un
wchar_t contient un caractère complet, sans qu'il soit nécessaire à se
retourner à un jeu de « représentation » (avec des encodages qui dépend
de l'état ou des caractères composés). (Note qu'en interne, on peut
avoir réelement un « jeu de caractère », avec des valeurs entières qui
représentent des caractères, indépendamment de la « représentation » de
ces valeurs.) Mais c'est une luxe que n'a que ceux qui sont venu
tardivement à l'internationalisation. Pendant longtemps, Unicode
prétendait que 16 bits suffiraient.
En attendant, il y a des fournisseurs qui se sont fixé sur 16 bits,
selon les anciennes normes Unicode, et qui sont coincés par des
problèmes de compatibilité. Ils ont le choix entre se restreindre à
UCS-2 (un sous-ensemble de Unicode) ou de passer à UTF-16 (un encodage
qui utilise des caractères composés). Dans l'ensemble, c'est la deuxième
solution qui a été adoptée. (J'avoue ne pas trop comprendre pourquoi. Du
moment que j'accepte de traiter des caractères composés, pourquoi pas
passer carrément à UTF-8 ?)
| Quote: | Mais ce n'est pas le cas. Si je ne me trompe pas, wchar_t peut même
être un typedef de char.
|
Selon la norme, oui. Sur les machines généraliste courantes, c'est
prèsque toujours soit 16 bits (UTF-16, chez Microsoft et IBM), soit
32 bits (UCS-4, chez des Unix, sauf AIX, et chez Linux).
--
James Kanze GABI Software mailto:kanze (AT) gabi-soft (DOT) fr
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|