C/C++

Отображение символов UTF8 в консоли Windows. (Си)

Есть десятичный код символа 'в'== 53426
https://i.voenmeh.ru/kafi5/Kam.loc/inform/UTF-8.htm
Сохраняю этот код в int и пытаюсь отобразить через wprintf.
Символ не отображается.

int main()
{
setlocale(LC_ALL, "Russian");
setlocale(LC_CTYPE,"C-UTF-8");
int a=53426;
wprintf(L"%lc\n",a);
}
Использовал эту инструкцию
https://russianblogs.com/article/6445673680/
Не помогает.
Ну так внутри юникод в винде хранится не в кодировке UTF-8. Попробуй int a = 0x432.
setlocale влияет только на кодировку при вводе и выводе, но не при обработке.
И кодировка правильно пишется через точку:
setlocale(LC_CTYPE,"C.UTF-8");
™М
™Темирлан Муратбеков™
69 120
Лучший ответ
Александр Круглов В Юникоде отображается. Мне надо именно в UTF8
В винде не получится? Почему?
Александр Круглов Когда я пишу так
setlocale(LC_ALL, "Russian");
unsigned int a=1074;
wprintf(L"%lc\n",a);
То выводится буква 'в' в консоле
Это значит что setlocale(LC_ALL, "Russian"); распознаёт utf16 код и конвертирует в русские символы.
Что мне кажется странным
Это ведь setlocale(LC_ALL, "Russian"); меняет кодирование на 1251 а не на utf16
--------------------
А это setlocale(LC_ALL,".UTF-8"); должно по идее распознавать код int a=53426; и тоже трансформировать в русские символы, не?
setlocale(LC_ALL,".UTF-8");
unsigned int a=53426;
wprintf(L"%lc\n",a);
Александр Круглов Локаль и кодировку не показывает почему то.
char*p=setlocale(LC_ALL, ".UTF8");
printf("%s\n",p);
Может даже кодировка не меняется на UTF8.
Александр Круглов Ввожу setlocale(LC_ALL, "Russian"); и при выводе из getwchar конвертирует в utf16 кириллицу
wchar_t не использую.
Это setlocale(LC_ALL, "Russian"); меняет ведь кодировку на 1251, почему в utf16 конвертирует кириллицу?
int a=getwchar();
wprintf(L"%d\n", a);
Александр Круглов > Ввожу setlocale(LC_ALL, "Russian"); и при выводе из getwchar конвертирует в utf16 кириллицу
Нет, не конвертирует.
Александр Круглов >>потому что в первом случае ты не задал локаль и программа считает, что у тебя терминал в какой-нибудь latin1 и неправильно интерпретирует ввод.
А wchar_t использовать не судьба?
Как ни крути, а хорошо работает до сих пор тип широких символов. Остальные варианты для вечно отсталой Винды не катят.
#include<wchar.h>
#include<locale.h>
setlocale(LC_ALL, "Russian");
wchar_t let=L'в';
wprintf(L"%lc",let);
...
...

Просто научись этим пользоваться.
Сергей Чалов
Сергей Чалов
37 945
Александр Круглов Проверьте код символа wprintf(L"%d",let);
Это юникод https://i.voenmeh.ru/kafi5/Kam.loc/inform/UTF-8.htm
1074
Александр Круглов Или это UTF32, а не Юникод?
Александр Круглов Этим я научился пользоваться, хотелось UTF8 попробовать
Александр Круглов Коды символов utf32 соответствуют кодам символов Юникода.
https://onlineunicodetools.com/convert-unicode-to-utf32 00000031000000300000003700000034
А как это ты использовал эту инструкцию?
У тебя ж команда chcp ни фига не дергается из кода. Ты в другом процессе поправил кодовую страницу, что ли, и теперь ожидаешь, что оно на всю юзер сессию подействует?
Ну, хз, мб Windows именно так и работает, но это было б как-то через жопу - нелогично, имхо.

Да и не очень понятно, зачем в UTF-8 нужны wchar-ы. Строка UTF8 оканчивается нулевым байтом, на символ уходит о 1 до 6 байт, на ASCII символ - в точности 1 байт и его бинарное представление совпадает со всеми однобайтными кодовыми страницами.
Как он должен с wchar-ами работать, фиг его знает.
Я б обычные char-ы использовал для UTF-8, просто надо помнить, что не ASCII-сивмол занимает больше байта. А код первого байта в символе в UTF-8 строке легко определить по попаданию в определенный числовой промежуток...