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?
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);
C++ en lui-même n'offre pas cette fonctionnalité. Vous aurez besoin d'une bibliothèque séparée, comme libiconv .
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"?
C Fonctions de bibliothèque standard: mbstowcs
et wcstombs
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()