使用boost locale进行字符串转换:Windows和Linux上的不同行为

时间:2014-03-11 16:58:54

标签: c++ linux windows boost locale

这是我的示例代码:

#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 个答案:

答案 0 :(得分:3)

Windows不会进行此转换,因为如果字符串长度突然发生变化,开发人员会“太混乱”。并且可能只是将所有Unicode转换委托给底层Windows API

Source

我想处理它的强大方法是使用第三方Unicode库,例如ICU。