LINUX.ORG.RU

Нужна помощь в вводе юникодной строки в программу C

 , ,


0

1

Гуглил, нашел только вывод юникодной строки. Вывод (printf, puts) работает, ввод латиницы (gets, fgets, scanf, fgetws) тоже.

Компилятор GCC, стандарт c17.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

int main() {
    char name[256]; char agestr[3]; int age;
    printf("Привет, как вас зовут? ");
    fgetws(name, sizeof(name), stdin); // по идее fgetws должен уметь читать юникод
    printf("Очень приятно, %s, сколько вам лет? ", name); // если в name кириллица, то ничего не выводит вместо %s
    fgets(agestr, sizeof(agestr), stdin);
    age = atoi(agestr);
    if (age == 18)
        printf("Мне столько же! Просто прекрасно!");
    else
        printf("\nМне 18 лет. Я на %i лет/года %s вас!", abs(age-18), ((age>18)? "младше" : "старше"));
}
Ответ на: комментарий от fsb4000

Хмм, 866. Ерунда какая-то… Я года 3 винду не трогал. Может в настройках «консоль Windows» что стоит? В Visual что напишешь в 1251, то в output в отладке и получишь. Из FAR потом запустишь, то же.

bugs-bunny
()
Ответ на: комментарий от utf8nowhere

Совместимости с DOS уже нет с Windows-7, забудьте. Любимый Volkov или Norton Comander, или любую DOS-прогу вы там уже не запустите. Даже 16-битный Word 6.x под Win 3.11 или 95. Все 16-битное похоронили, а 32-битное работает через врапперы.

UTF-8 в винде определится в редакторах и т.д., компилятор прожует исходник UTF-8, но в коде будет 1251 или UNICODE.

bugs-bunny
()
Ответ на: комментарий от MKuznetsov

Вот так у меня работает и на Windows и на Linux, файл в UTF-8 и никаких дополнительных флагов не передаю компилятору.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>

#ifdef _WIN32
#include <assert.h>
#include <io.h>
#include <fcntl.h>
void init_unicode(void)
{
    int result;
    result = _setmode(_fileno(stdout), _O_U16TEXT);
    assert(result != -1);
    result = _setmode(_fileno(stdin), _O_U16TEXT);
    assert(result != -1);
    result = _setmode(_fileno(stderr), _O_U16TEXT);
    assert(result != -1);
}
#else
#include <locale.h>
void init_unicode(void) {
    setlocale(LC_ALL, "");
}
#endif

int main() {
    init_unicode();

    wchar_t name[256]; wchar_t agestr[3]; int age;
    wprintf(L"Привет, как вас зовут? ");
    name[255] = L'\0';
    wscanf(L"%255ls", name);
    wprintf(L"Очень приятно, %ls, сколько вам лет? ", name);
    agestr[2] = L'\0';
    wscanf(L"%2ls", agestr);
    age = wcstol(agestr, NULL, 10);
    if (age == 18)
        wprintf(L"Мне столько же! Просто прекрасно!\n");
    else
        wprintf(L"Мне 18 лет. Я на %i лет/года %ls вас!\n", abs(age - 18), ((age > 18) ? L"младше" : L"старше"));
}
fsb4000 ★★★★★
()
Ответ на: комментарий от utf8nowhere

Пример рабочего кода будет?

У меня это не работает на Windows 10. printf печатает русские буквы, а scanf не считывает.

А тот код который я привёл работает даже на Windows XP.

fsb4000 ★★★★★
()
Ответ на: комментарий от fsb4000

Пример рабочего кода будет?

Нет, это ты же здесь махровый вендузятник, а не я. Мне негде проверять.

А тот код который я привёл работает даже на Windows XP.

Нашёл чем гордиться…

utf8nowhere ★★★
()