我想在我的std::strings
中存儲utf8
個字符。爲此,我使用boost::locale
轉換例程。正確使用boost locale生成器
在我的第一個測試一切正常:
#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");
預期的結果是:
utf8_string = "Grüssen"
normal_string = "Grüssen"
爲了擺脫通過「ISO-8859-15」作爲字符串我試圖用代替std::locale
。但不出所料
// 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());
結果並不:
utf8_string = "Gr|ssen"
normal_string = "Gr|ssen"
這有什麼錯我的使用使用std::locale
和發電機的? (編譯器VC2015,多字節字符集)
你如何檢查結果? 「期望」utf8_string =「Grüssen」'這很奇怪,因爲你基本上「期望」錯誤的解碼。另外,什麼是源文件編碼?如果它不是latin1,那就錯了。 – sehe
我用VC2015 Debugger檢查過它,我用win32 TextOutA打印normal_string,它是從utf8轉換而來的。 Notepad ++告訴我文件編碼是ANSI。那麼,看看utf_8字符串Grüssen「是不是被磨損的,因爲」Grâsse「是utf8編碼的Grüsse當你用期待iso8859-1的東西渲染時的樣子。那麼std :: locale在這裏使用有什麼問題,爲什麼第二個版本可以工作? –