1

所以我已经找到了如何在 C++ 字符串中大写单词?,但我尝试了与建议的类似代码,包括 Boost::locale 示例中提供的代码。我还将包括我的代码当前是什么以及预期和实际输出是什么。所以我试图理解为什么我没有得到预期的输出。

代码

#include <iostream>
#include <string>
#include <boost/locale.hpp>
#include <boost/algorithm/string/case_conv.hpp>

int main() {
    using namespace std;
    using namespace boost::locale;

    generator gen;
    auto loc = gen("");
    locale::global(loc);
    cout.imbue(loc);

    ios_base::sync_with_stdio(false);

    cout << to_upper("hello!") << " " << boost::to_upper_copy("hello!"s) << endl;
    cout << to_lower("HELLO!") << " " << boost::to_lower_copy("HELLO!"s) << endl;
    cout << to_title("hELLO!") << endl;
    cout << fold_case("HELLO!") << endl;

    return 0;
}

预期产出

HELLO! HELLO!
hello! hello!
Hello!
hello!

实际输出

HELLO! HELLO!
hello! hello!
hELLO!
hello!

附加信息

  • 操作系统:Windows 10 家庭版 64 位
  • 编译器:Microsoft Visual Studio 15.8.0
  • 平台:x64
  • 非默认编译选项:/std:c++latest
  • 提升版本:106700

编辑#1

似乎 vcpkg 安装的 Boost 没有使用 ICU 编译,这显然是boost::locale::to_title正常运行所必需的。

4

2 回答 2

1

vcpkg ( https://github.com/Microsoft/vcpkg ) 默认安装 Boost 而不依赖于 ICU 的 Boost::locale 和 Boost::regex 库。

所以,而不是安装这样的:

vcpkg install boost-locale:x64-windows boost-regex:x64-windows

我必须执行以下操作:

vcpkg install boost-locale[icu]:x64-windows boost-regex[icu]:x64-windows

这会自动获取并构建 ICU 库,并且(因为我已经安装了没有 ICU 的 Boost)它会自动重建所有Boost 库。

我希望这些库的 Boost 文档清楚地表明您需要 ICU 才能使用需要它的功能。

于 2018-08-18T04:15:58.227 回答
0

title_case仅根据boost locale的源代码为ICU处理,而对于其他平台,如 ex win32,它按原样返回输入值。

因此,为了使用to_title功能,您必须确保为 ICU 使用 boost locale

virtual string_type convert(converter_base::conversion_type how,char_type const *begin,char_type const *end,int flags = 0) const 
{
    icu_std_converter<char_type> cvt(encoding_);
    icu::UnicodeString str=cvt.icu(begin,end);
    switch(how) {
        ...
        case converter_base::title_case:
            str.toTitle(0,locale_);
            break;
        case converter_base::case_folding:
            str.foldCase();
            break;
        default:
            ;
    }
    return cvt.std(str);
}
于 2018-08-18T04:35:00.207 回答