Top.Mail.Ru
Ответы

Разное описание setlocale. (Си)

Что значат эти 4 записи?
И какая из них правильная?
Если все 4 правильные, то что они все означают? Разные кодировки?
Я встречал в кодах все 4 написания.

setlocale(LC_ALL, "Russian");
setlocale(LC_ALL, "Russ");
setlocale(LC_ALL, "russ");
setlocale(LC_ALL, "rus");

Дополнен

setlocale(LC_ALL,"ru");
setlocale(LC_ALL,"ru_ru")

По дате
По рейтингу
Аватар пользователя
Мастер

setlocale(LC_ALL, "Russian");

Аватар пользователя
Гуру

В контексте вопроса вообще не важно чему равна LC_ALL.
Первый аргумент функции указывает категорию локали.
LC_ALL - вся локаль.
Второй аргумент - имя локали или NULL. Пустая строка ("") указывает на локаль по умолчанию.

Аватар пользователя
Ученик

Проверьте букву 'я' с этим кодом:
Раскомментируйте по очереди 3 варианта setlocale
Разница есть
//setlocale(LC_ALL,"Russ");
//setlocale(LC_ALL,"Russian");
setlocale(LC_ALL,"Rus");
int name;
name=getwchar();
wprintf(L"%d\n", name);

Аватар пользователя
Ученик

Так какой вариант правильный?
Всё таки "Russ" ?
Работают у меня эти варианты:
"Russ"
"ru"
"ru_ru"

Аватар пользователя
Ученик

>>Отсюда еще много неправильно написанных параметров.
В моём коде?
Это какие?

Аватар пользователя
Ученик

Я поставил на инглиш винду. Сейчас это одним кликом в настройках делается.

Аватар пользователя
Ученик

А официальную информацию где нибудь можно посмотреть по этому поводу?

Аватар пользователя
Ученик

>>ru_ru =)
Что смешного?
Я этот пример сам выдумал, да, но на основе официального кода https://www.tutorialspoint.com/c_standard_library/c_function_setlocale.htm
Там написано "en_GB"

Аватар пользователя
Ученик

Блин ещё _wsetlocale есть

Аватар пользователя
Ученик

Возвращает однобайтовые коды на русские символы
_wsetlocale(LC_ALL, L"ru-RU");
int a;
a= getwchar();
wprintf(L"%ld\n", a);

Аватар пользователя
Ученик

Так работает
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
setlocale(LC_ALL, "Rus");
wchar_t b=L'у';
int a;
a= getwchar();
wprintf(L"%ld\n%c %d\n", a, b,b);

Аватар пользователя
Мыслитель

Русская локаль
В Винде - setlocale(LC_ALL, "Russian");
В Андроид, Дебиан - setlocale(LC_ALL, "Russian");
В Федоре - setlocale(LC_ALL, " ");

Аватар пользователя
Ученик

setlocale(LC_ALL, " "); Пустые скобки означают что надо использовать ту локаль, которая имеет Операционная система.

Аватар пользователя
Ученик

Почему getwchar при этой конструкции
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
setlocale(LC_ALL, "Russian");
возвращает двухбайтные символы?
Если убрать или это
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
или это setlocale(LC_ALL, "Russian");
то getwchar возвращает или случайные значения или однобайтную кодировку.
Полный код так выглядит
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
setlocale(LC_ALL, "Russian");
wchar_t b=L'я';
int a;
a= getwchar();
wprintf(L"%ld\n%c %d\n", a, b,b);

Аватар пользователя
Мыслитель

SetConsoleCP это нестандартная функция Майкрософт. Её не нужно смешивать с setlocale. Сама setlocale написана только для использования символов wchar, и больше ни для чего другого. А SetConsole наверное больше подойдет для отображения двухбайтовых char-символов, как попытка реализовать кодировку utf-8. Это моё мнение. Но я давно не работаю в Windows, поэтому не в курсе, что там с новшествами Майкрософт.

Аватар пользователя
Ученик

Это факт что правильно не работает по отдельности
Попробуйте например так
setlocale(LC_ALL, "Russian");
int a;
a= getwchar();
wprintf(L"%c %d\n", a,a);
Во первых возвращает однобайтную кодировку, во вторых не отображает символы.

Аватар пользователя
Ученик

setlocale(LC_ALL, "Russian"); распознаёт сохранённые символы wchar_t f=L'я';

А a= getwchar(); возвращает у меня странные коды символов, поэтому setlocale не может правильно это распознать.
Для того чтоб getwchar возвращало правильные однобайтные коды, я сначал пишу это
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
Потом все однобайтные символы этим setlocale(LC_ALL, "Russian"); перевожу в широкие символы

Получается здесь a= getwchar(); и здесь wchar_t f=L'я'; одинаковый код

Аватар пользователя
Ученик

Вы ведь на линуксе работаете?
Я думаю у вас это
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
выставлено по дефолту.
Потому что мне надо вводить это
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
чтоб потом это setlocale(LC_ALL, "Russian");
могло распознать что вернул wscanf

Те же самые неправильные коды возвращает wscanf без этого
SetConsoleOutputCP(1251);
SetConsoleCP(1251);

Аватар пользователя
Ученик

Да, я видел.
%lc- Long Char
%ls-Long String

Аватар пользователя
Ученик

Что означает эта большая буква L, которую перед ковычками ставят? wscanf(L""
Аббревеатура

Аватар пользователя
Ученик

Да я давно ей пользуюсь, просто не знаю что она означает. Перевод что ли

Аватар пользователя
Ученик

А код не работает это точно.
Я выше думаю хорошо описал логику. 44 минуты назад



Видео по теме