Используя кодовую страницу 437 и setlocale одновременно - PullRequest
0 голосов
/ 30 мая 2018

Есть несколько специальных символов из кодовой страницы 437, которые я хочу использовать в функции, которая печатает n-арные деревья, чтобы я мог сделать что-то вроде этого:

http://www.randygaul.net/wp-content/uploads/2015/06/Capture1.png (в основном что-то похожеек команде tree в linux)

Проблема в том, что мой алгоритм использует setlocale(LC_ALL, "Portuguese"), который портится с этими специальными символами.Я хотел знать, могу ли я как-то применить локаль C по умолчанию только к этой функции.

1 Ответ

0 голосов
/ 30 мая 2018

Просто сохраните текущую локаль, а затем восстановите:

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);
   }
}

Обратите внимание, локаль является общей для всех потоков процесса, поэтому вам необходимо приостановить все остальные потоки (или убедиться, что они этого не делают).вызывать любые зависящие от локали функции) при вызове такой функции.

С posix setlocale :

После успешного завершения setlocale () должна вернуть строку, связанную суказанная категория для новой локали.В противном случае setlocale () должна возвращать нулевой указатель, а языковой стандарт программы не изменяется.
Нулевой указатель для языкового стандарта заставляет setlocale () возвращать указатель на строку, связанную с категорией для текущего языкового стандарта программы.
Строка, возвращаемая setlocale (), такова, что последующий вызов с этой строкой и связанной с ней категорией должен восстановить эту часть языкового стандарта программы.

...