2015-12-17 1 views
1

Я могу установить языковой стандарт, используя функцию setlocale(). Но есть ли способ получить локаль и сохранить ее в переменной, чтобы потом ее можно было сбросить.Функция getlocale() в C

Это то, что я пытаюсь сделать:

str=getlocale(LC_CTYPE); 
setlocale(LC_CTYPE,"en_US"); 
... 
setlocale(LC_CTYPE,str); 

Как я могу реализовать функцию getlocale(), или есть ли альтернатива?

+2

это localeconv: возвращает локальную структуру Я считаю, – dboals

+2

Вы можете прочитать [ЗДЕСЬ] (http://man7.org/linux/man- страницы/man3/setlocale.3.html) о setlocale (3). или используйте 'man setlocale', если вы находитесь на машине Unix. – Michi

+0

Вы даже ** попробовали ** прочитать страницу руководства? (Http://man7.org/linux/man-pages/man3/setlocale.3.html) * Функция setlocale() используется для установки или запроса текущей локали программы. ... Успешный вызов setlocale() возвращает непрозрачную строку, которая соответствует набору локалей. * –

ответ

6

Вы можете передать NULL и использовать возвращаемое значение. См. setlocale

Вы также можете использовать эту функцию, чтобы узнать текущий язык, передав нулевой указатель в качестве аргумента locale. В этом случае setlocale возвращает строку, которая является именем региона, выбранного в данный момент для категории.

Или в стандарте C:

7.11.1.1 Setlocale функция
....

Если указатель на строку дается для locale и выбор может быть honored, функция setlocale возвращает указатель на строку, связанную с указанным category для новой локали. Если выбор не может быть выполнен, функция setlocale возвращает нулевой указатель, и локаль программы не изменяется.

нулевой указатель для locale вызывает функцию setlocale вернуть указатель на строки, связанной с category для текущей локали программы; локаль программы не изменяется.

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

+0

@AlexD Cheers !. – Annabelle

0

Ниже пример, приведенный в GNU page, подобно вашей цели:

#include <stddef.h> 
#include <locale.h> 
#include <stdlib.h> 
#include <string.h> 

void 
with_other_locale (char *new_locale, 
        void (*subroutine) (int), 
        int argument) 
{ 
    char *old_locale, *saved_locale; 

    /* Get the name of the current locale. */ 
    old_locale = setlocale (LC_ALL, NULL); 

    /* Copy the name so it won't be clobbered by setlocale. */ 
    saved_locale = strdup (old_locale); 
    if (old_locale == NULL) 
    fatal ("Out of memory"); 

    /* Now change the locale and do some stuff with it. */ 
    setlocale (LC_ALL, new_locale); 
    (*subroutine) (argument); 

    /* Restore the original locale. */ 
    setlocale (LC_ALL, saved_locale); 
    free (saved_locale); 
} 
2

Дано:

char* getlocale(int cat) 
{ 
    return setlocale(cat, NULL) ; 
} 

ваш код будет еще не совсем работа, так как указатель, возвращаемый является ссылкой текущий язык, не копия. Вы должны взять копию:

char saved_locale[32] ; 
strcpy(saved_locale, getlocale(LC_CTYPE)) ; 
setlocale(LC_CTYPE, "en_US") ; 
... 
setlocale(LC_CTYPE, saved_locale) ; 

или

char* saved_locale = strdup(getlocale(LC_CTYPE)) ; 
setlocale(LC_CTYPE, "en_US") ; 
... 
setlocale(LC_CTYPE, saved_locale) ; 
free(saved_locale) ;