簡體   English   中英

C++ 獲取用戶首選編碼或區域設置編碼

[英]C++ get the user preferred encoding or locale encoding

我想用 c++ 中的 python 代碼實現相同的結果:

import locale
encoding = locale.getpreferredencoding()

我的電腦上的encoding是“cp936”(windows 10,簡體中文)

我嘗試以下 C++ 代碼:

測試1.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)

問題二:添加#include <boost/filesystem.hpp> ,程序運行,但是encoding是“utf-8”,為什么? 我以為是'cp936',和test1.cpp的結果一致

問題:通過 c++ 獲取語言環境編碼的最佳想法是什么(與 python 的locale.getpreferredencoding()實現相同的結果)。 非常感謝!

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

問題 1:代碼會導致鏈接錯誤,除非包含另一個標題:#include,為什么? 是否有任何文件說要使用 boost::locale 還必須包含 boost::filesystem?

自動鏈接無法按預期工作。 這是一個可向 boost 庫開發人員報告的錯誤。 在這種特殊情況下,我將猜測¹ Boost System 應該已鏈接,並且 Boost Locale/Boost System 標頭不包含相應的編譯指示。

包含 Boost Filesystem正好解決了鏈接錯誤,因為它確實有 library pragma

¹ 因為您未能顯示鏈接器錯誤

python 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();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM