同时使用代码页437和setlocale

时间:2018-05-30 11:05:15

标签: c locale codepage-437

代码页437中有一些特殊字符,我想在打印n-ary树的函数中使用,所以我可以这样做:

http://www.randygaul.net/wp-content/uploads/2015/06/Capture1.png (基本上类似于linux中的tree命令)

问题是,我的算法正在使用setlocale(LC_ALL, "Portuguese"),这会与那些特殊字符混淆。我想知道我是否可以以某种方式单独将C默认语言环境应用于该函数。

1 个答案:

答案 0 :(得分:1)

只需保存当前区域设置,然后恢复:

void func_with_my_own_locale(void) {
   const char * localesave = setlocale(LC_ALL, NULL);
   assert(localesave != NULL); // or some fprintf(stderr, ....);
   if (setlocale(LC_ALL, "CP437" /* or "" */) == NULL) {
       assert(0);
   }
   ...... 
   if (setlocale(LC_ALL, localesave) == NULL) {
       assert(0);
   }
}

请注意,locale在进程中的所有线程之间共享,因此您需要在调用此类函数时暂停所有其他线程(或确保它们不调用任何与语言环境相关的函数)。

来自posix setlocale

  

成功完成后,setlocale()将返回与新语言环境的指定类别关联的字符串。否则,setlocale()将返回一个空指针,并且程序的语言环境不会改变   语言环境的空指针使setlocale()返回指向与程序当前语言环境的类别关联的字符串的指针。
  setlocale()返回的字符串是这样的,使用该字符串及其相关类别的后续调用将恢复该程序区域的那部分。