Je veux stocker utf8
caractères dans mon std::strings
. Pour cela j'ai utilisé boost::locale
routines de conversion.En utilisant le générateur de locale de poussée correctement
Dans mon premier tout test fonctionne comme prévu:
#include <boost/locale.hpp>
std::string utf8_string = boost::locale::conv::to_utf<char>("Grüssen", "ISO-8859-15");
std::string normal_string = boost::locale::conv::from_utf(utf8_string, "ISO-8859-15");
Le résultat attendu est:
utf8_string = "Grüssen"
normal_string = "Grüssen"
Pour se débarrasser de passage "ISO-8859-15" en tant que chaîne j'ai essayé d'utiliser std::locale
à la place.
// Create system default locale
boost::locale::generator gen;
std::locale loc=gen("ISO8859-15");
std::locale::global(loc);
// This is needed to prevent C library to
// convert strings to narrow
// instead of C++ on some platforms
std::ios_base::sync_with_stdio(false);
std::string utf8_string = boost::locale::conv::to_utf<char>("Grüssen", std::locale());
std::string normal_string = boost::locale::conv::from_utf(utf8_string, std::locale());
Mais le résultat est pas comme prévu:
utf8_string = "Gr|ssen"
normal_string = "Gr|ssen"
Quel est le problème avec mon utilisation de l'utilisation std::locale
et générateur? (Compilateur VC2015, charset multi-octets)
boost::locale::generator
Comment inspectez-vous les résultats? Il est bizarre de "s'attendre" à utf8_string = "Grüssen" 'car essentiellement vous" attendez "à un mauvais décodage. Aussi, quel est le codage du fichier source? Si c'est autre chose que latin1, c'est faux. – sehe
Je l'ai inspecté avec le débogueur VC2015 et j'ai utilisé win32 TextOutA pour imprimer le normal_string, qui a été converti à partir de utf8. Notepad ++ me dit que le codage du fichier est ANSI. Eh bien, voir la chaîne utf_8 Grüssen "n'est pas étrange, parce que" Grüsse "est la façon dont le Grüsse encodé par utf8 ressemble quand on le rend avec quelque chose qui attend iso8859-1. pourquoi la seconde version fonctionne-t-elle? –