【问题标题】:how do I set the proper initial locale for a C++ program on Windows?如何在 Windows 上为 C++ 程序设置正确的初始语言环境?
【发布时间】:2009-02-20 21:47:55
【问题描述】:

我对本地化编程相当陌生,我正在尝试弄清楚如何为新启动的非托管 C++ 应用程序(从应用程序内部)设置正确的初始语言环境。

据我所知,新应用程序从 C 语言环境开始,而不是正确的区域语言环境(英语、德语等)。所以我需要做的是调用setlocale( LC_ALL, "???" ),但我不确定如何获得第二个参数的正确值。它将类似于“英语”或“德语:德国”——基本上是用户通过区域和语言选项控制面板设置的任何语言环境。为了清楚起见,我不是在寻找如何格式化语言环境字符串,我正在寻找运行应用程序的计算机的正确语言环境字符串。

我猜有一些 Win32 API 可以给我这个,或者可能是一个包含正确值的注册表项。有人知道我应该做什么吗?

【问题讨论】:

    标签: c++ windows localization locale


    【解决方案1】:

    setlocale() 是 C,而不是 C++。我隐约记得在 VC6 上看到了两者之间的干扰,但那是一个错误。通常,setlocale() 只影响 C 函数的行为。

    在 C++ 中,本地化由 std::locale 类控制。默认情况下,区域设置敏感操作使用全局区域设置,它是通过默认构造一个区域设置对象获得的,可以使用 std::locale::global(const std::locale&) 设置。

    使用空字符串 (std::locale("")) 构造语言环境对象会创建与程序环境相对应的语言环境。

    在程序启动时,全局语言环境是“C”或“经典”语言环境。要将全局语言环境设置为程序的环境语言环境(我猜这就是您要问的),您可以这样写:

    std::locale::global(std::locale(""));
    

    例如,我的区域设置当前设置为法语(加拿大)。运行这个:

    int main(void)
    {
      std::cout << std::locale().name() << std::endl;
      std::locale::global(std::locale(""));
      std::cout << std::locale().name() << std::endl;
      std::locale::global(std::locale("C"));
      std::cout << std::locale().name() << std::endl;
      return 0;
    }
    

    打印:

    C
    French_Canada.1252
    C
    

    【讨论】:

    • 太好了,这正是我所需要的。看起来您还可以将给定 C++ 语言环境的 name() 传递给 setlocale(),以设置 C 语言环境。
    猜你喜欢
    • 2013-07-01
    • 2010-10-31
    • 2022-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    相关资源
    最近更新 更多