OVH Cloud OVH Cloud

TEXT("hello") et L"hello"

7 réponses
Avatar
Vincent Hiribarren
Bonjour, si je fait :

int main(int argc, char* argv[])
{
OutputDebugString("hello world\n");
// Affiche "hello world"

OutputDebugString(TEXT("hello world\n"));
// Affiche "hello world"

OutputDebugString(L"hello world\n");
// Affiche "h"

return 0;
}

Sauf erreur de ma part, le préfixe "L" permet d'afficher des "wide
characters", donc des caractères unicodes.
Or, dans winnt.h, on a :

#define TEXT(quote) __TEXT(quote) // r_winnt
#define __TEXT(quote) L##quote

Donc normalement, TEXT("hello") et L"hello" devraient être
équivalents. Or, comme le montre l'exemple plus haut, ça ne semble pas
être tout à fait le cas.

Quelle est donc l'explication ?

En vous remerciant d'avance !

7 réponses

Avatar
Remi THOMAS
"Vincent Hiribarren" écrivit

Donc normalement, TEXT("hello") et L"hello" devraient être équivalents.
Or, comme le montre l'exemple plus haut, ça ne semble pas être tout à fait
le cas.

Quelle est donc l'explication ?

En vous remerciant d'avance !



Bonjour,
Voir l'article suivant:
http://www.codeppc.com/evc/articles/unicode.html

Rémi

--
Rémi THOMAS
MVP Visual C++ .NET
http://www.pixel-technology.com/rthomas
Avatar
Thierry
Vincent Hiribarren écrivait
news::

Quelle est donc l'explication ?



A defaut de #define UNICODE c'est la version A(nsi) de OutputDebugString
qui est appellée.
Avatar
Vincent Hiribarren
Remi THOMAS wrote:

Voir l'article suivant:
http://www.codeppc.com/evc/articles/unicode.html



Très intéressant. Et je comprends mieux l'utilisation des TCHAR que je
vois partout. Merci.
Avatar
Vincent Hiribarren
Thierry wrote:
Vincent Hiribarren écrivait
news::

Quelle est donc l'explication ?



A defaut de #define UNICODE c'est la version A(nsi) de OutputDebugString
qui est appellée.



Oui, j'avais râté la macro conditionnelle dans le winnt.h. Du coup,
j'ai fait varier la macro UNICODE et j'ai obtenu des résultats
différents : "hello" a affiché des ?????, et L"hello" s'est affiché
correctement.

Cependant, y-a-t'il une explication au fait que L"hello" n'affiche
qu'un "h" si je suis en ANSI ? Pourquoi pas une erreur de compilation,
par exemple ?
Avatar
adebaene
Vincent Hiribarren wrote:
Thierry wrote:
> Vincent Hiribarren écrivait
> news::
>
>> Quelle est donc l'explication ?
>
> A defaut de #define UNICODE c'est la version A(nsi) de OutputDebugString
> qui est appellée.

Oui, j'avais râté la macro conditionnelle dans le winnt.h. Du coup,
j'ai fait varier la macro UNICODE et j'ai obtenu des résultats
différents : "hello" a affiché des ?????, et L"hello" s'est affiché
correctement.

Cependant, y-a-t'il une explication au fait que L"hello" n'affiche
qu'un "h" si je suis en ANSI ? Pourquoi pas une erreur de compilation,
par exemple ?



Cette notion de "être en ANSI" ou "être en Unicode" est un peu
artificielle et ne veut pas dire grand chose : tu peux très bien avoir
une appli qui manipule les 2 types de texte.
Par exemple, j'ai une appli où tout l'IHM est en Unicode (pour
l'internationalisation) et où UNICODE est défini, mais entre autre
choses cette appli communique par liaison RS avec un périphérique qui
"parle" un protocole ASCII : toute cette partie de code manipule bien
entendu des char, pas des wchar. Il n'y a pas "d'erreur" détectable
par le compilo à manipuler des char dans une appli Unicode ou
vice-versa.

Arnaud
Avatar
Thierry
Bonjour,

Vincent Hiribarren a écrit :

Cependant, y-a-t'il une explication au fait que L"hello" n'affiche
qu'un "h" si je suis en ANSI ?



Comme tu précise L"" ta chaine sera en unicode en mémoire :
"hello".

La version Ansi s'arrete au premier octet nul.

--
« Le travail est probablement ce qu'il y a sur cette terre de plus bas et
de plus ignoble. Il n'est pas possible de regarder un travailleur sans
maudire ce qui a fait que cet homme travaille, alors qu'il pourrait nager,
dormir dans l'herbe ou simplement lire ou faire l'amour avec sa femme. »
Boris VIAN
Mon blog RSS : http://yarglah.free.fr/monblog_rss.php <<




Avatar
Vincent Hiribarren
Thierry wrote:
Bonjour,

Vincent Hiribarren a écrit :

Cependant, y-a-t'il une explication au fait que L"hello" n'affiche
qu'un "h" si je suis en ANSI ?



Comme tu précise L"" ta chaine sera en unicode en mémoire :
"hello".

La version Ansi s'arrete au premier octet nul.



Ah oui. Exactement. Je n'y pensais pas du tout. Du coup je comprends
bien mieux toute la gestion de l'unicode en C. Merci.