web-dev-qa-db-fra.com

Conversion de chaînes unicode et inversement

Je suis un peu novice en utilisant Unicode string et des pointeurs et je ne sais pas du tout comment la conversion d'unicode en ascii et vice-versa fonctionne. Voici ce que j'essaie de faire,

const wchar_t *p = L"This is a string";

Si je voulais le convertir en char*, comment la conversion fonctionnerait-elle avec la conversion de wchar_t* en char* et vice-versa?

ou par valeur en utilisant wstring à string, objet de classe et inversement

std::wstring wstr = L"This is a string";

Si je suis correct, pouvez-vous simplement copier la chaîne dans un nouveau tampon sans conversion?

14
user963241

Les solutions dépendent de la plate-forme. Sous Windows, utilisez les fonctions MultiByteToWideChar et WideCharToMultiByte API. Sur les plates-formes Unix/linux iconv library est assez populaire.

Dans le futur (VS 2010 le supporte déjà), cela sera possible en C++ standard (enfin!):

#include <string>
#include <locale>
#include <codecvt>
std::wstring_convert<std::codecvt_utf8<wchar_t>> converter;
const std::wstring wide_string = L"This is a string";
const std::string utf8_string = converter.to_bytes(wide_string);
22
Philipp

C++ en lui-même n'offre pas cette fonctionnalité. Vous aurez besoin d'une bibliothèque séparée, comme libiconv .

3
Thomas

La conversion de ASCII en Unicode et inversement est assez simple. De par leur conception, les 128 premières valeurs Unicode sont identiques à ASCII (en fait, les 256 premières sont égales à ISO-8859-1).

Le code suivant fonctionne donc sur les systèmes où char est ASCII et wchar_t est Unicode:

const char* ASCII = "Hello, world";
std::wstring Unicode(ASCII, ASCII+strlen(ASCII));

Vous ne pouvez pas l'inverser aussi simplement: 汉 existe en Unicode mais pas en ASCII, alors comment voulez-vous le "convertir"?

3
MSalters

C Fonctions de bibliothèque standard: mbstowcs et wcstombs

3
cpx

L'algorithme widen () convertit char en wchar_t:

char a;
a = 'a';
whcar_t wa = cin.widen(a);

Bien sûr, vous devez le mettre en boucle. Et résolvez le *; Le contraire est accompli par narrow()

0
bratao