Oué, fait gaffe, la fenêtre DOS utilise un jeu de caractère qui n'a rien à voir avec celui de Windows. DOS utilise je ne sais plus quel code page préhistorique, windows pour son charset 8bit utilise le code page 1252 a.k.a. Windows1252 qui assez proche de l'iso-8859-1 (a.k.a Latin1). Pour le charset dit unicode, c'est de l'UTF-16LE.
Pour faire simple :
- CP1252 et le truc DOS sont compatibles ASCII (128 premiers caractères), le reste est différent. Ce sont des charsets 8bits, les éditeurs sous Windows vont mettre du CP1252 dans tes chaines, ceux sous DOS (entre autres les éventuels paramètres que tu vas passer à ton programme -- sauf si tu passes par ton IDE), le charset DOS dédié donc. En C, tu utilises les chaines classiques, entre double quote et c'est tout.
- UTF-16 : tu peux soit te farcir les codes caractères à la main dans les chaines à coup de \xXX\xXX ou préfixer tes chaines par L, du genre : L"Hello". En mémoire tes caractères seront stockés sur 16bits, ordre des octets de ta machine (certainement du little endian). Pour utiliser de telle chaine dans la famille de fonction printf, tu dois utiliser le spécificateur %S ou %ls (ce qui sous DOS revient à tronquer les caractères sur 8bits).
L'API Win32 en rajoute une couche (haha) : elle définit la macro _T(chaine) qui rajoutera automatiquement le L si tu compile ton programme en unicode ou non (je ne me rappelle plus le nom de la macro, mais gougeule doit s'en souvenir). En fait si tu regardes l'API Win32, 90% des fonctions sont en doubles : une version pour les charsets 8bits et une autre pour l'UTF-16.
Chais pas si c'est plus clair ...
Perso je préfère passer par de l'UTF-8 (because j'utilisais du CP1252 avant) et convertir à la volée (la conversion UTF-8 => CP1252 ou UTF-16 est assez triviale) si besoin.
Message édité par tpierron le 07-09-2007 à 01:36:51