Преобразование строки с языковым стандартом Boost: различное поведение в Windows и Linux

Это мой пример кода:

#pragma execution_character_set("utf-8")

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

int main()
{
    std::locale loc = boost::locale::generator().generate("");
    std::locale::global(loc);

#ifdef MSVC
    std::cout << boost::locale::conv::from_utf("grüßen vs ", "ISO8859-15");
    std::cout << boost::locale::conv::from_utf(boost::locale::to_upper("grüßen"), "ISO8859-15") << std::endl;
    std::cout << boost::locale::conv::from_utf(boost::locale::fold_case("grüßen"), "ISO8859-15") << std::endl;
    std::cout << boost::locale::conv::from_utf(boost::locale::normalize("grüßen", boost::locale::norm_nfd), "ISO8859-15") << std::endl;
#else
    std::cout << "grüßen vs ";
    std::cout << boost::locale::to_upper("grüßen") << std::endl;
    std::cout << boost::locale::fold_case("grüßen") << std::endl;
    std::cout << boost::locale::normalize("grüßen", boost::locale::norm_nfd) << std::endl;
#endif

    return 0;
}

Выход на Windows 7:

grüßen vs GRÜßEN
grüßen
grußen

Вывод в Linux (openSuSE 12.3):

grüßen vs GRÜSSEN
grüssen
grüßen

В Linux немецкая буква "ß" преобразуется в "SS", как и предполагалось, в то время как в Windows этот символ остается неизменным.

Вопрос: почему это так? Как я могу исправить конверсию?

Некоторые примечания: Кодовая страница консоли Windows установлена ​​на 1252. В обоих случаях локали устанавливаются на de_DE. Я попытался заменить настройку локали по умолчанию в листинге выше на "de_DE.UTF-8" - без какого-либо эффекта. В Windows этот код скомпилирован с Visual Studio 2013, в Linux с GCC 4.7, C++11 включен.

Любые предложения приветствуются - заранее спасибо за вашу поддержку!

1 ответ

Windows не делает это преобразование, потому что "было бы слишком запутанно" для разработчиков, если длина строки внезапно изменилась. И повышение, по-видимому, просто делегирует все преобразования Unicode базовым API-интерфейсам Windows.

Источник

Я предполагаю, что надежный способ справиться с этим - использовать стороннюю библиотеку Unicode, такую ​​как ICU.

Другие вопросы по тегам