Почему boost::locale::to_title не возвращает ожидаемый результат?

Итак, я уже нашел, Как сделать заглавными буквами слово в строке 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 Home 64-битная
  • Компилятор: Microsoft Visual Studio 15.8.0
  • Платформа: x64
  • Параметры компиляции не по умолчанию: /std:c++latest
  • BOOST_VERSION: 106700

РЕДАКТИРОВАТЬ #1

Похоже, что Boost, установленный vcpkg, не компилируется с ICU, что, очевидно, требуется для boost::locale::to_title функционировать правильно.

2 ответа

Решение

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 в соответствии с исходным кодом языка Boost, в то время как для других платформ, таких как ex 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);
}
Другие вопросы по тегам