2011-01-28 5 views
9

Je voudrais convertir une chaîne char* à une chaîne wchar* en C.Convertir char * à * wchar en C

J'ai trouvé beaucoup de réponses, mais la plupart d'entre eux sont C++. Pourriez-vous m'aider?

Merci.

+2

Quel est le codage d'origine dans votre 'char *'? UTF8? ANSI? Quel est le 'sizeof (wchar)' sur votre système et sur quel encodage dépend-il? UCS-2 (16bit)? UCS-4 (32bit)? – Benoit

+0

@Benoit: Whoa ... Je pensais que 'sizeof (wchar)' était toujours 2, non? – Mehrdad

+0

@Mehrdad: Ce n'est pas nécessairement 2. Il est défini par l'implémentation. Si vous programmez sur Windows, il a une taille de deux octets et contient UTF-16, avec double wchar_t pour les paires de substitution. – Benoit

Répondre

3

setlocale() suivi de mbstowcs().

+0

Cela est correct tant que l'entrée est une chaîne ANSI. – Benoit

+0

@Benoit: Oui, il y a évidemment plus de conversion de chaîne que d'appeler une seule fonction. Mais je n'ai pas donné de détails car je pense que c'est tout ce que les OP recherchent ... – Mehrdad

+0

L'imput provient de LdapDirectory, donc je suppose que c'est un UTF8? – Crupuk

14

Essayez swprintf avec le drapeau %hs.

Exemple:

wchar_t ws[100]; 
swprintf(ws, 100, L"%hs", "ansi string"); 
+0

je vais essayer ce soir, pour l'instant je n'ai pas accès à un shell.Merci – Crupuk

+0

@NickDandoulakis Je pense que cette réponse pourrait être très utile, mais j'ai découvert que swprintf pourrait avoir 2 interfaces possibles, pourriez-vous s'il vous plaît jeter un oeil à cette question? http://stackoverflow.com/q/17716763/2436175 – Antonio

+0

@Antonio L'interface qui nécessite la longueur du tampon est celle qui est portable. –

-1

Si vous arrive d'avoir la availiable API Windows, la fonction de conversion MultiByteToWideChar offre une conversion de chaînes configurable de différents encodages UTF-16. Cela peut être plus approprié si vous ne vous souciez pas trop de la portabilité et que vous ne voulez pas savoir exactement quelles sont les implications des différents paramètres régionaux pour la conversion de chaîne.

1

ce que vous cherchez est

mbstowcs 

fonctionne exactement comme la fonction de copie de char * à char *

mais dans ce cas vous enregistrez dans un wchar_t *

-2

si vous avez actuellement des caractères ANSI. il suffit d'insérer un 0 ('\ 0') avant chaque caractère et de les transtyper en wchar_t *.