为什么 boost::locale::to_title 没有返回预期的输出?
Why is boost::locale::to_title not returning the expected output?
所以我已经找到了 How to capitalize a word in a C++ string?,但我已经尝试了与建议的类似代码,包括 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!
附加信息
- OS: Windows 10 家 64 位
- 编译器:微软Visual Studio15.8.0
- 平台:x64
- 非默认编译选项:
/std:c++latest
- BOOST_VERSION: 106700
编辑#1
好像vcpkg安装的boost没有编译通过
与 ICU,这显然是 boost::locale::to_title
所必需的
正常运行。
vcpkg (https://github.com/Microsoft/vcpkg) 默认安装 Boost,而不依赖 Boost::locale 和 Boost::regex 库的 ICU。
所以,与其像这样安装:
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 才能使用需要它的功能。
title_case
仅针对 ICU as per source code of boost locale, while for other platforms like for ex win32 处理 returns 输入值。
因此,为了使用 to_title
功能,您必须确保为 ICU 使用 boost 区域设置
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);
}
所以我已经找到了 How to capitalize a word in a C++ string?,但我已经尝试了与建议的类似代码,包括 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!
附加信息
- OS: Windows 10 家 64 位
- 编译器:微软Visual Studio15.8.0
- 平台:x64
- 非默认编译选项:
/std:c++latest
- BOOST_VERSION: 106700
编辑#1
好像vcpkg安装的boost没有编译通过
与 ICU,这显然是 boost::locale::to_title
所必需的
正常运行。
vcpkg (https://github.com/Microsoft/vcpkg) 默认安装 Boost,而不依赖 Boost::locale 和 Boost::regex 库的 ICU。
所以,与其像这样安装:
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 才能使用需要它的功能。
title_case
仅针对 ICU as per source code of boost locale, while for other platforms like for ex win32 处理 returns 输入值。
因此,为了使用 to_title
功能,您必须确保为 ICU 使用 boost 区域设置
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);
}