部分打开或关闭C/C++本地化功能的方法

C/C++有初级的本地化功能,但是实际上由于C/C++程序编写者很多地方并没有考虑本地化功能,如果打开所有本地化功能,肯定会有问题。比如使用printf、scanf、cin、cout时肯定很多人没有考虑到打开本地化之后会有千位分隔符,小数点也不一定是句点。

这里列出了ANSI C、C++、Linux C中部分打开或关闭本地化功能的方法:

// opt-in (按需打开) using ANSI C
setlocale(LC_ALL, "C");
setlocale(LC_CTYPE, ""); // 打开LC_CTYPE本地化功能

// opt-out (按需关闭) using ANSI C
setlocale(LC_ALL, "");
setlocale(LC_NUMERIC, "C"); // 关闭LC_NUMERIC本地化功能

// opt-in using C++
using namespace std;
locale loc(locale::classic(), "", locale::ctype); // 打开LC_CTYPE本地化功能
wcout.imbue(loc); // 应用到wcout

// opt-out using C++
using namespace std;
locale loc(locale(""), "C", locale::numeric); // 关闭LC_NUMERIC本地化功能
wcout.imbue(loc); // 应用到wcout

// opt-in using Linux C (thread-safe)
locale_t loc = newlocale(LC_CTYPE_MASK, "", 0); // 打开LC_CTYPE本地化功能
locale_t oldloc = uselocale(loc);
// ...
uselocale(oldloc);
freelocale(loc);

// opt-out using Linux C (thread-safe)
locale_t loc = newlocale(LC_ALL_MASK, "", 0);
loc = newlocale(LC_NUMERIC_MASK, "C", loc); // 关闭LC_NUMERIC本地化功能
locale_t oldloc = uselocale(loc);
// ...
uselocale(oldloc);
freelocale(loc);
发布了29 篇原创文章 · 获赞 1 · 访问量 3400

猜你喜欢

转载自blog.csdn.net/defrag257/article/details/103747207