Alexandr
Мудрец
(11979)
3 года назад
setlocale(LC_ALL, "Russian");
serdПросветленный (20240)
3 года назад
В контексте вопроса вообще не важно чему равна LC_ALL.
Первый аргумент функции указывает категорию локали.
LC_ALL - вся локаль.
Второй аргумент - имя локали или NULL. Пустая строка ("") указывает на локаль по умолчанию.
kh fjkgЗнаток (327)
3 года назад
Проверьте букву 'я' с этим кодом:
Раскомментируйте по очереди 3 варианта setlocale
Разница есть
//setlocale(LC_ALL,"Russ");
//setlocale(LC_ALL,"Russian");
setlocale(LC_ALL,"Rus");
int name;
name=getwchar();
wprintf(L"%d\n", name);
kh fjkgЗнаток (327)
3 года назад
Так какой вариант правильный?
Всё таки "Russ" ?
Работают у меня эти варианты:
"Russ"
"ru"
"ru_ru"
kh fjkgЗнаток (327)
3 года назад
>>Отсюда еще много неправильно написанных параметров.
В моём коде?
Это какие?
kh fjkgЗнаток (327)
3 года назад
Я поставил на инглиш винду. Сейчас это одним кликом в настройках делается.
kh fjkgЗнаток (327)
3 года назад
А официальную информацию где нибудь можно посмотреть по этому поводу?
kh fjkgЗнаток (327)
3 года назад
Возвращает однобайтовые коды на русские символы
_wsetlocale(LC_ALL, L"ru-RU");
int a;
a= getwchar();
wprintf(L"%ld\n", a);
kh fjkgЗнаток (327)
3 года назад
Так работает
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);
kh fjkgЗнаток (327)
3 года назад
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'я'; одинаковый код
Евгений Высочин
Просветленный
(38033)
3 года назад
Русская локаль
В Винде - setlocale(LC_ALL, "Russian");
В Андроид, Дебиан - setlocale(LC_ALL, "Russian");
В Федоре - setlocale(LC_ALL, " ");
kh fjkgЗнаток (327)
3 года назад
setlocale(LC_ALL, " "); Пустые скобки означают что надо использовать ту локаль, которая имеет Операционная система.
kh fjkgЗнаток (327)
3 года назад
Почему 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);
Евгений ВысочинПросветленный (38033)
3 года назад
SetConsoleCP это нестандартная функция Майкрософт. Её не нужно смешивать с setlocale. Сама setlocale написана только для использования символов wchar, и больше ни для чего другого. А SetConsole наверное больше подойдет для отображения двухбайтовых char-символов, как попытка реализовать кодировку utf-8. Это моё мнение. Но я давно не работаю в Windows, поэтому не в курсе, что там с новшествами Майкрософт.
kh fjkgЗнаток (327)
3 года назад
Это факт что правильно не работает по отдельности
Попробуйте например так
setlocale(LC_ALL, "Russian");
int a;
a= getwchar();
wprintf(L"%c %d\n", a,a);
Во первых возвращает однобайтную кодировку, во вторых не отображает символы.
kh fjkgЗнаток (327)
3 года назад
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'я'; одинаковый код
kh fjkgЗнаток (327)
3 года назад
Вы ведь на линуксе работаете?
Я думаю у вас это
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
выставлено по дефолту.
Потому что мне надо вводить это
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
чтоб потом это setlocale(LC_ALL, "Russian");
могло распознать что вернул wscanf
Те же самые неправильные коды возвращает wscanf без этого
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
kh fjkgЗнаток (327)
3 года назад
Что означает эта большая буква L, которую перед ковычками ставят? wscanf(L""
Аббревеатура
kh fjkgЗнаток (327)
3 года назад
Да я давно ей пользуюсь, просто не знаю что она означает. Перевод что ли
kh fjkgЗнаток (327)
3 года назад
А код не работает это точно.
Я выше думаю хорошо описал логику. 44 минуты назад
kh fjkgЗнаток (327)
3 года назад
Дело не в этом. Вы не учитываете то какая у меня сейчас кодировка. Я и сам то не знаю какая она.
А это
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
просто ставит корректную кодировку для кириллицы.
Кстати можно ли через код узнать какая у меня кодировка? Не сравнивая коды символов)
kh fjkgЗнаток (327)
3 года назад
Уменьшал до одного.
\build-untitled4-Desktop_Qt_6_1_3_MinGW_64_bit-Release\release\untitled4.exe
(null)
kh fjkgЗнаток (327)
3 года назад
Процесс висит, конечной фразы нет: Нажните любую кнопку для выхода
kh fjkgЗнаток (327)
3 года назад
А, вот появилась эта фраза. Очень долго просто ждало. Это не из за компа
kh fjkgЗнаток (327)
3 года назад
То же самое:
my locale = C
Если включаю setlocale(LC_ALL, "Russian");
то выдаёт my locale = Russian_Russia.1251
Если включаю это
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
то ничего не меняется
my locale = C
kh fjkgЗнаток (327)
3 года назад
В этом и проблема видно была.
Кодировка у меня какая то стандартная машинная.
И какая из них правильная?
Если все 4 правильные, то что они все означают? Разные кодировки?
Я встречал в кодах все 4 написания.
setlocale(LC_ALL, "Russian");
setlocale(LC_ALL, "Russ");
setlocale(LC_ALL, "russ");
setlocale(LC_ALL, "rus");