2016-08-20 7 views
2

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
+0

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

+0

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? –

Répondre

1

veut un identifiant de localisation , non pas simplement un codage (le même codage peut être utilisé par plusieurs paramètres régionaux). Le schéma utilisé est language_country.encoding, vous aurez donc besoin de de_DE.ISO-8859-15.

En outre, vous jouez avec le feu en mettant des caractères non-ASCII dans votre code source. Faites attention.

Votre commentaire sur sync_with_stdio() est aussi bizarre. Il s'assure simplement que les tampons sont vidés.

+0

'sync_with_stdio()' s'assure que les tampons ne sont/pas/inutilement vidés entre C/C++ IO ** et ** supprime les prérequis pour la synchronisation des threads http://en.cppreference.com/w/ cpp/io/ios_base/sync_with_stdio – sehe