Проверьте язык локали в C - PullRequest
0 голосов
/ 05 марта 2012

Я хочу проверить, является ли моя система zh_TW.UTF-8 или zh_CN.UTF-8.

Используйте следующий код, я могу сказать, что это UTF-8. Но как я могу определить, является ли это zh_TW или zh_CN?

#include <langinfo.h>
#include <locale.h>
#include <stdio.h>
#include <stdlib.h>

int
main(int argc, char *argv[])
{
   //setlocale(LC_CTYPE,"");
   setlocale(LC_ALL,"");
   printf("%s\n",nl_langinfo(CODESET));
   printf("%s\n",nl_langinfo(CRNCYSTR));
   exit(EXIT_SUCCESS);
}

Ответы [ 3 ]

2 голосов
/ 05 марта 2012

В POSIX-подобной системе есть простой способ: попробуйте команду locale:

system("locale");

или

FILE *handle = popen("locale", "r+");

size_t readn;
char buf[128];
while ((readn = fread(buf, 1, 128, handle)) > 0) {
    fwrite(buf, 1, readn, stdout);
}
pclose(handle);
1 голос
/ 05 марта 2012

Попробуйте:

printf("%s\n", setlocale(LC_ALL, ""));

И прочитайте это .

0 голосов
/ 05 марта 2012

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

char *loc_str = setlocale(LC_ALL, "");

if (loc_str == 0)
    ...failed to set locale...
printf("LC_ALL = %s\n", loc_str);

Если вы установите одну категорию, вы получите строку, которая позволит вам восстановить эту категорию. Вы можете посмотреть на LC_COLLATE и посмотреть, что установлено:

char *loc_str = setlocale(LC_COLLATE, "");
if (loc_str == 0)
    ...failed to set locale...
printf("LC_COLLATE = %s\n", loc_str);

1012 * Etc. *

Это может дать или не дать вам понятную человеку ценность - но, по крайней мере, поэкспериментируйте, чтобы увидеть, что она использует.

Вы также можете посмотреть переменную окружения LANG или переменные окружения LC_*.

...