c++ - 使用 boost locale : different behaviour on windows and linux 进行字符串转换

标签 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 编译。

如有任何建议,我们将不胜感激 - 在此先感谢您的支持!

最佳答案

Windows 不进行这种转换,因为如果字符串长度突然改变,对开发人员来说“太困惑了”。并且 boost 大概只是将所有 Unicode 转换委托(delegate)给底层的 Windows API

Source

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

关于c++ - 使用 boost locale : different behaviour on windows and linux 进行字符串转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22331487/

相关文章:

windows - 使用多个线程访问单个文件

c++ - 是否可以不在类头文件中包含类变量?

javascript - 使用 Emscripten C++ Web Worker 高效传输大型数组 : which JavaScript design is better?

c++ - 虚函数指针是虚表索引吗?

c++ - 如何在 C++ 中最大化 SSD I/O?

java - 理解 perf.map

linux - ext4被认为是文件存储还是 block 存储?

c - 在 Windows 上获取 C 中的总交换大小?

linux - 为什么getcontext和setjmp在glibc-x86-64中保存不同的寄存器

linux - 如何指定 libcurl SFTP hmac 选项