C ++获取用户首选编码或语言环境编码

时间:2017-10-11 11:05:21

标签: python c++ boost encoding

我想用c ++中的python代码实现相同的结果:

import locale
encoding = locale.getpreferredencoding()

我的电脑上的encoding是'cp936'(Windows 10,简体中文)

我尝试以下C ++代码:

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;
}

嗯......我仍然不满意,所以我转向boost::locale(boost_1_65_1),但有一些奇怪的行为。

测试2.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;
}

问题1:代码会导致链接错误,除非包含另一个标头:#include <boost/filesystem.hpp>,为什么?是否有任何文件要说使用boost::locale,还必须包含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)" (?system_category@system@boost@@YAAEBVerror_category@12@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)" (?system_category@system@boost@@YAAEBVerror_category@12@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)" (?system_category@system@boost@@YAAEBVerror_category@12@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)" (?system_category@system@boost@@YAAEBVerror_category@12@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)" (?generic_category@system@boost@@YAAEBVerror_category@12@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)" (?generic_category@system@boost@@YAAEBVerror_category@12@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)" (?generic_category@system@boost@@YAAEBVerror_category@12@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)" (?generic_category@system@boost@@YAAEBVerror_category@12@XZ)

问题2:通过添加#include <boost/filesystem.hpp>,程序会运行,但encoding是“utf-8”,为什么?我认为它是'cp936',与 test1.cpp

的结果一致

问题:通过c ++获取语言环境编码的最佳方法是什么(使用python的locale.getpreferredencoding()实现相同的结果)。非常感谢!

环境: win10 64位,vs2015,boost_1_65_1(windows pre-build,lib64-msvc-14.0)

2 个答案:

答案 0 :(得分:0)

  

问题1:代码会导致链接错误,除非包含另一个标题:#include,为什么?是否有任何文件要说使用boost :: locale还必须包含boost :: filesystem?

自动链接无法正常工作。这是一个可以向boost库devs报告的错误。在这种特殊情况下,我将 guess ¹应该已经链接了Boost系统,并且Boost Locale / Boost System标头不包含适当的编译指示。< / p>

包含Boost文件系统发生以解决链接错误,因为 具有库编译指示

¹,因为您无法显示链接器错误

答案 1 :(得分:0)

python setEGLContextClientVersion()的等价物:

locale.getpreferredencoding()