代码之家  ›  专栏  ›  技术社区  ›  Charlie

如何设置Windows上C++程序的适当初始区域设置?

  •  15
  • Charlie  · 技术社区  · 16 年前

    对于本地化编程,我是相当新的,我正在尝试找出如何为新启动的非托管C++应用程序(从应用程序中)设置合适的初始区域设置。

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

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

    1 回复  |  直到 16 年前
        1
  •  29
  •   Éric Malenfant    16 年前

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

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

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

    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