gpt4 book ai didi

c++ - 正确使用 boost 区域设置生成器

转载 作者:行者123 更新时间:2023-12-01 19:29:36 25 4
gpt4 key购买 nike

我想在我的 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 想要一个区域设置 id,而不仅仅是一个编码(相同的编码可以由多个区域设置使用)。它使用的方案是 language_country.encoding,因此您需要 de_DE.ISO-8859-15

此外,您在源代码中添加非 ASCII 字符也是在玩火。小心点。

你对sync_with_stdio()的评论也很奇怪。它只是确保刷新缓冲区。

关于c++ - 正确使用 boost 区域设置生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39059560/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com