Так я уже нашел Как сделать заглавным слово в строке 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!
/std:c++latest
Похоже, что Boost, установленный vcpkg, не компилируется
с реанимацией, которая, по-видимому, требуется для boost::locale::to_title
в
функционировать правильно.
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, и (поскольку я уже установил Boost без ICU), она автоматически перестраивается все из библиотеки Boost.
Я хотел бы, чтобы документация Boost для этих библиотек дала понять, что вам нужен ICU, чтобы использовать функциональность, которая требует этого.
title_case
обрабатывается только для ICU согласно исходному коду повысить языковой стандарт, в то время как для других платформ, как для бывших win32 он возвращает входное значение как есть.
Итак, чтобы использовать to_title
Функция, которую вы должны убедиться, что вы используете Boost локаль для ICU
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);
}