正确使用boost语言环境生成器
Using boost locale generator correctly
我想在我的 std::strings
中存储 utf8
个字符。为此,我使用了 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,字符集多字节)
boost::locale::generator
想要一个 locale id,而不仅仅是一个编码(相同的编码可能被多个语言环境使用)。它使用的方案是 language_country.encoding
,因此您需要 de_DE.ISO-8859-15
.
此外,您在源代码中放置非 ASCII 字符是在玩火。小心。
你对 sync_with_stdio()
的评论也很奇怪。它只是确保缓冲区被刷新。
我想在我的 std::strings
中存储 utf8
个字符。为此,我使用了 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,字符集多字节)
boost::locale::generator
想要一个 locale id,而不仅仅是一个编码(相同的编码可能被多个语言环境使用)。它使用的方案是 language_country.encoding
,因此您需要 de_DE.ISO-8859-15
.
此外,您在源代码中放置非 ASCII 字符是在玩火。小心。
你对 sync_with_stdio()
的评论也很奇怪。它只是确保缓冲区被刷新。