Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Jeux de caractères : MBCS/char* [ Divers / Divers ] (rt15)

jeudi 13 novembre 2008 à 12:37:44 | Jeux de caractères : MBCS/char*

rt15

Membre Club Administrateur CodeS-SourceS
Salut,

Prenons le code suivant, qui affiche ce qu'il y a après le dernier \ de la chaîne :

void test()
{
  char* lpPath = "c:\\toto";
  char* lpCurrent;
  char* lpLastBackSlash;
 
  lpCurrent = lpPath;
  lpLastBackSlash = lpCurrent;

  while (*lpCurrent)
  {
    if (*lpCurrent == '\\')
    {
      lpLastBackSlash = lpCurrent;
      lpLastBackSlash++;
    }
    lpCurrent++;
  }
  printf(lpLastBackSlash);
}

A première vue pas d'erreur, ou du moins ça ressemble au genre de code que l'on peut s'attendre pour faire ce genre de chose : char* et incrémentation de pointeurs.

Ce code est compilé en MBCS, Multiple Byte Character Set. On a le choix entre MBCS et UNICODE, sachant que char* n'est pas du tout UNICODE, on ne peut compiler qu'en MBCS. Autrement dit, un caractère peut faire plusieurs octets.

Autrement dit, ce code est potentiellement faux, dans le cas où lpPath viendrait par exemple de GetCurrentDirectory. Potentiellement faux revient à dire qu'il est faux...

Il faudrait utiliser _mbsinc (Ou _tcsinc) pour incrémenter les pointeurs et _mbccmp (Ou _tccmp) pour comparer les caractères.

Mais on peut pas dire que ce soit des fonctions couramment utilisées...

Des réflexions sur le sujet ?


jeudi 13 novembre 2008 à 17:22:05 | Re : Jeux de caractères : MBCS/char*

SAKingdom

Membre Club
... hein ???

"dans le cas où lpPath viendrait par exemple de GetCurrentDirectory"

À moins que je me trompe, il existe 2 versions de cette fonction : GetCurrentDirectoryA et GetCurrentDirectoryW
La première étant pour l'ascii, l'autre pour le UNICODE. GetCurrentDirectory sera transformée en une ou l'autre de ces fonctions par le préprocesseur selon que tu utilises unicode ou mbcs. Je ne vois donc pas où est le problème.
Même chose pour LPTSTR qui sera transformé en LPSTR ou LPWSTR.

De toute façon, char est utilisé pour ascii et wchar_t pour UNICODE qui correspond, si ma mémoire est bonne, à une sorte de short. Il y aura très certainement des erreurs de compilation si tu essais d'utiliser l'un avec un code fait pour l'autre.

Ceci dit, je ne comprend pas trop ta reflexion... peut-être veux tu dire autre chose.

"Il faudrait utiliser _mbsinc (Ou _tcsinc) pour incrémenter les pointeurs"

Incrémenter un pointeur via une fonction... on croirait de l'interpréter.

C++ (@++)


jeudi 13 novembre 2008 à 17:40:15 | Re : Jeux de caractères : MBCS/char*

rt15

Membre Club Administrateur CodeS-SourceS
Salut SAKingdom,

En fait le problème que je tente de soulever n'a rien à voir avec l'Unicode. Je travaille ici, comme la plupart des gens sur ce site, en MBCS.

Donc j'utilise effectivement GetCurrentDirectoryA.

GetCurrentDirectoryA me renverra du MBCS.
Donc elle peut me renvoyer des caractères codés sur plusieurs octets.
Donc je ne peux pas utiliser l'incrémentation de pointeurs, le == pour la comparaison...

Dans la majorité des cas, incrémenter le pointeur fonctionne, car GetCurrentDirectory me renvoie des chaînes où un caractère correspond à un octet...

Mais dans quel cas cela ne fonctionne-t-il pas ? Sur les Windows Chinois ? Japonais ?

Et pourquoi (presque ?) tout le monde se fiche de _mbsinc ?

jeudi 13 novembre 2008 à 17:47:26 | Re : Jeux de caractères : MBCS/char*
jeudi 13 novembre 2008 à 23:03:46 | Re : Jeux de caractères : MBCS/char*

BruNews

Administrateur CodeS-SourceS
Réponse acceptée !

Un prog qu'on sait devoir distribuer aussi dans les pays exotiques DOIT être compilé en UNICODE, les problèmes de MBCS avec quelle page de code est en vigueur sont révolus. Windows travaille complètement UNICODE en interne donc tout va bon.
Le lien que tu as donné est obsolète, d'une époque où UNICODE arrivait seulement.

Utilise TCHAR au lieu de char, ça passera partout et tes pointeurs se déplaceront toujours comme il se doit.

Exemple que tu pourras compiler comme tu veux:
void __stdcall AppPathInitialize()
{
  TCHAR szthis[300];
  TCHAR* c = szthis + GetModuleFileName(0, szthis, 300);
  while(*c != '\\') c--; *c = 0;
  SetCurrentDirectory(szthis);
}

ciao...
BruNews, MVP VC++


vendredi 14 novembre 2008 à 14:20:35 | Re : Jeux de caractères : MBCS/char*


Cette discussion est classé dans : code, char, lpcurrent, mbcs, lplastbackslash


Répondre à ce message

Sujets en rapport avec ce message

Autre question sur les pointeurs [ par Darkneon ] Salut,J'ai le code suivant.#include char strA[27] = "abcdefghijklmnopqrstuvwxyz";int main(void){ char *pA; "désallocation" inopinée [ par vecchio56 ] J'ai touvé un truc bizarre avec Visual C++ 6: le code suivant plante:#include void f(char* a){ a = new char[100]; // alloue de la Char et caractère NULL [ par Arecibo ] Lorsque je déclare : char Texte[16];est ce que je déclare :- une variable de type char de 16 caractères PLUS le caractère NULLou- une vari conversion char-->hexadécimal [ par ivdz ] Bonjour,Est-ce que quelqu'un sait convertir un char en sa valeur hexadécimal ?Voici ce que j'ai essayé :char mot[]="255";int hexa;sscanf(mot Liberation de la mémoire [ par Xentor609 ] Salut,Voici le code qui me pose un pitit probleme:char* fonction(){char* buf=new char[MAX_BUF];//traitement du bufreturn buf;}void MyFunc()< Erreur DeviceIoControl ??? pk acces refusé ? [ par akk ] Bonjour,Voila lorsque j'execute ce code :(on passe le nom du lecteur en parametre exemple : main C)#include #include <iostre Pointeur et liberation de memoire [ par Darkneon ] Salut, J'avais un probleme apres que je liberais de la memoire allouer a un pointeur, le message "Null pointer assignment" m'apparaisait toujours. Le Question de noob avec char :D [ par Bricomix ] Salut à tous,Voilà, je suis noob en C++, j'ai lu un book et j'ai tappé le code suivant :#include using namespace std;int main() Erreurs de compilations bizarres avec Visual C++ 6 [ par VTS_35 ] Bonjour,G encore des problèmes de compilation avec mon programme. Je me suis rendu compte que le programme allait devenir balaise, alors j'ai décidé d assembleur dans du code c [ par guillaume80 ] bjour a tous,dans un code c récupéré, j'ai pris le code pr le compiler sauf qu'il y a eu des soucis, il m'en reste un, c'est le suivant :char *ecran =


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version


LG KP501

Entre 9€ et 159€


Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,562 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.