2017-10-11 1 views
-3

Je veux obtenir le même résultat avec les codes python en C++:C++ obtenir l'encodage préféré de l'utilisateur ou le codage locale

import locale 
encoding = locale.getpreferredencoding() 

Le encoding est 'CP936' sur mon PC (Windows 10, chinois simplifié)

-je essayer les codes C++ suivants: de

test1.cpp:

#include <iostream> 
#include <clocale> 

using namespace std; 

int main() 
{ 
    setlocale(LC_ALL, ""); 
    string lc_all = std::setlocale(LC_ALL, NULL); 
    cout << lc_all << endl; // prints Chinese (Simplified)_China.936 
    return 0; 
} 

Hmm ... Je ne suis toujours pas satisfait, donc je me tourne vers boost::locale (boost_1_65_1), mais il y a des comportements étranges.

test2.cpp:

#include <iostream> 
#include <boost/locale.hpp> 

using namespace std; 

int main() 
{ 
    boost::locale::generator gen; 
    string encoding = std::use_facet<boost::locale::info>(gen("")).encoding(); 
    cout << encoding << endl; 
    return 0; 
} 

Problème 1: Les codes entraîneront des erreurs de lien, à moins inclure une autre tête: #include <boost/filesystem.hpp>, pourquoi? Y at-il un document à dire pour utiliser boost::locale on doit également inclure boost::filesystem?

1>libboost_locale-vc140-mt-1_65_1.lib(generator.obj) : error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::system_category(void)" ([email protected]@[email protected]@[email protected]@XZ) 
1>libboost_locale-vc140-mt-1_65_1.lib(date_time.obj) : error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::system_category(void)" ([email protected]@[email protected]@[email protected]@XZ) 
1>libboost_locale-vc140-mt-1_65_1.lib(localization_backend.obj) : error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::system_category(void)" ([email protected]@[email protected]@[email protected]@XZ) 
1>libboost_locale-vc140-mt-1_65_1.lib(lcid.obj) : error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::system_category(void)" ([email protected]@[email protected]@[email protected]@XZ) 
1>libboost_locale-vc140-mt-1_65_1.lib(generator.obj) : error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::generic_category(void)" ([email protected]@[email protected]@[email protected]@XZ) 
1>libboost_locale-vc140-mt-1_65_1.lib(date_time.obj) : error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::generic_category(void)" ([email protected]@[email protected]@[email protected]@XZ) 
1>libboost_locale-vc140-mt-1_65_1.lib(localization_backend.obj) : error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::generic_category(void)" ([email protected]@[email protected]@[email protected]@XZ) 
1>libboost_locale-vc140-mt-1_65_1.lib(lcid.obj) : error LNK2001: unresolved external symbol "class boost::system::error_category const & __cdecl boost::system::generic_category(void)" ([email protected]@[email protected]@[email protected]@XZ) 

Problème 2: En ajoutant #include <boost/filesystem.hpp>, le programme fonctionne, mais encoding est "utf-8", pourquoi? Je pensais que ce soit « CP936 », en accord avec le résultat de test1.cpp

Question: Quelle est la meilleure idée pour obtenir le codage local par C++ (obtenir le même résultat avec locale.getpreferredencoding() de python). Merci beaucoup!

Environnement: win10 64bit, vs2015, boost_1_65_1 (fenêtres pré-construction, lib64-msvc-14,0)

+0

Lisez d'abord le document! – Silencer

+0

@Silencer Comment pouvez-vous voir que je n'ai pas lu le document?Vous pourriez donner un commentaire plus utile, par exemple le bon endroit du soi-disant 'document' – oz1

+1

Cela se voit parce que http://www.boost.org/doc/libs/1_62_0/libs/locale/doc/html/examples .html montre exactement ce que vous devez faire. – UKMonkey

Répondre

0

python de l'équivalent locale.getpreferredencoding():

std::string getpreferredencoding() 
{ 
    std::string strCodePage = boost::locale::util::get_system_locale(); 
    std::locale loc = boost::locale::generator().generate(strCodePage); 
    return std::use_facet<boost::locale::info>(loc).encoding(); 
} 
0

Problème 1: Les codes entraîneront des erreurs de lien, à moins inclure une autre tête: #include , Pourquoi? Existe-t-il un document à utiliser pour utiliser boost :: locale, il faut aussi inclure boost :: filesystem?

La liaison automatique ne fonctionne pas comme prévu. Ceci est un bug reportable aux développeurs de la bibliothèque boost. Dans ce cas particulier, je vais deviner ¹ Boost System aurait dû être lié, et les en-têtes Boost Locale/Boost System n'incluent pas les pragmas appropriés pour cela.

Y compris Boost Filesystem arrive pour résoudre l'erreur de lien, car il fait ont la bibliothèque pragma

¹ parce que vous ne parvenez pas à montrer les erreurs de l'éditeur de liens

+0

Merci d'avoir signalé cela, les erreurs de liaison ajouté. – oz1