Bonjour, j'ai essayé d'envoyer une chaîne unicode à une console avec iostreams et a échoué.
J'ai trouvé ça : Utilisation d'une police unicode dans une application console c++. et ce snippet fonctionne.
SetConsoleOutputCP(CP_UTF8);
wchar_t s[] = L"èéøÞæa";
int bufferSize = WideCharToMultiByte(CP_UTF8, 0, s, -1, NULL, 0, NULL, NULL);
char* m = new char[bufferSize];
WideCharToMultiByte(CP_UTF8, 0, s, -1, m, bufferSize, NULL, NULL);
wprintf(L"%S", m);
Cependant, je n'ai pas trouvé de moyen de sortir l'unicode correctement avec iostreams. Avez-vous des suggestions ?
Cela ne fonctionne pas :
SetConsoleOutputCP(CP_UTF8);
utf8_locale = locale(old_locale,new boost::program_options::detail::utf8_codecvt_facet());
wcout.imbue(utf8_locale);
wcout << L"¡Hola!" << endl;
EDIT Je n'ai pas trouvé d'autre solution que d'envelopper ce snippet dans un flux. J'espère que quelqu'un a une meilleure idée.
//Unicode output for a Windows console
ostream &operator-(ostream &stream, const wchar_t *s)
{
int bufSize = WideCharToMultiByte(CP_UTF8, 0, s, -1, NULL, 0, NULL, NULL);
char *buf = new char[bufSize];
WideCharToMultiByte(CP_UTF8, 0, s, -1, buf, bufSize, NULL, NULL);
wprintf(L"%S", buf);
delete[] buf;
return stream;
}
ostream &operator-(ostream &stream, const wstring &s)
{
stream - s.c_str();
return stream;
}
0 votes
Pourriez-vous préciser en quoi elle est défaillante ? Vous obtenez des caractères tronqués ou erronés, par exemple ? Avez-vous essayé de capturer STDOUT et de vérifier que les bons octets sont envoyés mais ne sont pas affichés ?
1 votes
Il affiche des espaces réservés au lieu de caractères. Je n'ai pas cherché très loin. La seule chose que je peux dire, c'est que pour une raison quelconque, la même chaîne envoyée à wcout ou cout devient folle alors que wprintf l'affiche sans problème.
0 votes
Seulement un peu de Les caractères Unicode peuvent être affichés correctement dans la console Win32. La console ne prend pas en charge les caractères trop compliqués ou ceux qui ont des marques de combinaison qui affectent leur taille. Essayez-le avec
WriteConsoleW
-- Si ça ne marche pas avec ça, alors c'est impossible.