Wchar

Signaler
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009
-
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
-
j'ai un objet de type ( const wchar_t * ). Je voudrais passer cet objet en paramètre d'une fonction f( const char * ).

Existe-t-il une fonction de conversion standard ?
A voir également:

13 réponses

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Sous Windows:
WideCharToMultiByte
MultiByteToWideChar

ciao...
BruNews, MVP VC++
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

Connais tu une fonction portable ? Mon application est destinée à linux et windows ?

Je comprend pas la différence entre multibyte char et wide char d'ailleurs.
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
la 1ere passe de unicode vers char, l'autre l'inverse.

Je ne connais pas d'équivalent en C, existe ?

S'il y a la même chose chez Unix tu mets entre des #ifdef...

ciao...
BruNews, MVP VC++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Tu as essayé wcstombs/mbstowcs?
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
ah oui semble bon ça.

ciao...
BruNews, MVP VC++
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

wchar_t * locale_to_wchar(char * str)
{
wchar_t * ptr;
size_t s;

/* first arg == NULL means 'calculate needed space' */
s=mbstowcs(NULL, str, 0);

/* a size of -1 is triggered by an error in encoding; never
happen in ISO-8859-* locales, but possible in UTF-8 */
if(s == -1)
return(NULL);

/* malloc the necessary space */
if((ptr=(wchar_t *)malloc((s + 1) * sizeof(wchar_t))) == NULL)
return(NULL);

/* really do it */
mbstowcs(ptr, str, s);

/* ensure NULL-termination */
ptr[s]=L'\0';

/* remember to free() ptr when done */
return(ptr);
}

char * wchar_to_locale(wchar_t const * str)
{
char * ptr;
size_t s;

/* first arg == NULL means 'calculate needed space' */
s=wcstombs(NULL, str, 0);

/* a size of -1 means there are characters that could not
be converted to current locale */
if(s == -1)
return(NULL);

/* malloc the necessary space */
if((ptr=(char *)malloc(s + 1)) == NULL)
return(NULL);

/* really do it */
wcstombs(ptr, str, s);

/* ensure NULL-termination */
ptr[s]='\0';

/* remember to free() ptr when done */
return(ptr);
}
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

Ca semble fonctionner....
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

La constness n'est pas bonne, penser à la corriger avant utilisation.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Et voila ce que BruNews adore, une fonction qui renvoie un pointeur à libérer. C'est vrai que c'est pas joli!
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
J'ADORE LES BELLES FUITES MEMOIRE !!!

ciao...
BruNews, MVP VC++
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Si ca se trouve l'appelant connait la taille de la chaine, mais ta fonction de conversion va la calculer sans te demander (premier appel à wcstombs/mbstowcs) puis va faire la conversion, c'est long
Messages postés
371
Date d'inscription
dimanche 4 janvier 2004
Statut
Membre
Dernière intervention
23 septembre 2009

J'avoue ne pas avoir cherché à comprendre ce code qui est tiré d'un site dont j'ai perdu l'URL.

J'ai préféré passer toute mon appli en wchar_t, plutot que d'insérer ce genre de m**** dans mon code.

Cela dit, je vois pas de fuite de mémoire si l'utilisateur libère comme indiqué le pointeur retourné.
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Bien sur, mais on peut considérer qu'il est facile de l'oublier si on n'y pense pas tout de suite. Quand on cherche la fuite, difficile de voir d'ou ca vient quand on voit pas de malloc. Faut alors chercher dans toutes les fonctions qui allouent elles même