gpt4 book ai didi

c++ - C++ 中线程特定的语言环境操作

转载 作者:太空宇宙 更新时间:2023-11-04 12:18:13 25 4
gpt4 key购买 nike

是否有任何标准方法可以通过每个线程跨平台进行语言环境设置?我看到 xlocale 提供了 uselocale,但它在 Windows 中不受支持。有“_configthreadlocale(_ENABLE_PER_THREAD_LOCALE);”在 Windows 中,之后 setlocale 在每个线程的基础上工作。我的问题是,是否有一个库以独立于平台的方式提供这些特定于语言环境的操作???或者其他一些方法?

谢谢,悟空。

最佳答案

我遇到了同样的问题,我最终为它写了一些小的交叉兼容性代码。我试图跟随 specification尽可能接近,但它确实有一些限制。

在此代码中 newlocale不允许您指定基本语言环境,您也不能混合类别掩码。但是对于不同语言环境之间的一些基本切换,这应该足够了。

// Locale Cross-Compatibility
#ifdef _WIN32
#define locale_t _locale_t
#define freelocale _free_locale

#define LC_GLOBAL_LOCALE ((locale_t)-1)
#define LC_ALL_MASK LC_ALL
#define LC_COLLATE_MASK LC_COLLATE
#define LC_CTYPE_MASK LC_CTYPE
#define LC_MONETARY_MASK LC_MONETARY
#define LC_NUMERIC_MASK LC_NUMERIC
#define LC_TIME_MASK LC_TIME

// Base locale is ignored and mixing of masks is not supported
#define newlocale(mask, locale, base) _create_locale(mask, locale)

locale_t uselocale(locale_t new_locale)
{
// Retrieve the current per thread locale setting
bool bIsPerThread = (_configthreadlocale(0) == _ENABLE_PER_THREAD_LOCALE);

// Retrieve the current thread-specific locale
locale_t old_locale = bIsPerThread ? _get_current_locale() : LC_GLOBAL_LOCALE;

if(new_locale == LC_GLOBAL_LOCALE)
{
// Restore the global locale
_configthreadlocale(_DISABLE_PER_THREAD_LOCALE);
}
else if(new_locale != NULL)
{
// Configure the thread to set the locale only for this thread
_configthreadlocale(_ENABLE_PER_THREAD_LOCALE);

// Set all locale categories
for(int i = LC_MIN; i <= LC_MAX; i++)
setlocale(i, new_locale->locinfo->lc_category[i].locale);
}

return old_locale;
}
#endif

将该代码放入您的项目中,您将能够像这样在任何平台上切换每个线程的语言环境:

#include <locale.h>
#ifdef __APPLE__
#include <xlocale.h>
#endif

// Apply a new locale to this thread
locale_t locale = newlocale(LC_NUMERIC_MASK, "C", NULL);
locale_t old_locale = uselocale(locale);

// Print out some text
printf("Always use dot-decimal notation: %f", 1.5);

// Restore the global locale
uselocale(old_locale);
freelocale(locale);

关于c++ - C++ 中线程特定的语言环境操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6561723/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com