среда, 10 января 2018 г.

Кодировка символов

Как узнать код нажатой клавиши?

    unsigned char c;
    do{
      c=cin.get();
      cout<<c<<":"<<int(c)<<endl;
    }while(c!=10); //пока не ввели Enter (код 10):

Но существует проблема с русскими буквами: в таблице ASCII (шрифт Terminal) они разбросаны, поэтому лучше собрать их в одну строку:

    string s="абвгдеёжзийклмнопрстуфхцчшщъыьэюя";

При этом кодировка текста программы не должна быть 16-битной, установите, например, windows-1251. Сменить кодировку можно в Блокноте.

При выводе сменить кодировку можно с помощью библиотеки locale.h:

    setlocale(0,"rus");

Если нужен код русского символа, то он будет отрицательным, поэтому используйте сдвиг на 256 или преобразование типов unsigned int:

    for (int i=0;i<s.size();i++)
        cout<<s[i]<<":"<<int(s[i])+256<<endl;

Ввод из файла лучше осуществить построчно:

    ifstream fin("input.txt");
    string f;
    while(getline(fin,f))
    {
        cout<<f.size()<<":"<<f<<endl;
    }

Если всё же нужен посимвольный ввод, то есть проблема с русской буквой 'я'. Её код совпадает с кодом конца файла EOF (-1).

    char q;   
    do
    {
        q=fin.get();

//не все буквы русские, если код отрицательный - делаем сдвиг:

        cout<<q<<":"<<(int(q)+256)%256 << endl;

        cout<<q<<":"<<(int(q)+((q<0)?256:0) << endl; 

//если в тексте есть буква  'я' и это не конец файла,
//то нужно как то прочитать файл дальше:   
 
     if(q==EOF)
        {
            q=fin.get();
            cout<<q<<":"<<int(q)<<endl;
        }

    }while(q!=EOF);

Вывод всех символов и их кодов в виде таблицы:
 
    for (int i=0; i<256; i++)
    {
          cout.width(5);//ширина столбца 5 символов

//есть команды/клавиши с кодами:
//7 - подача звука
//8 - BackSpace
//9 -Tab
//10 - Enter
//13 - в начало строки
//27 - Esc
//32 - Space (пробел)
// их вывод лучше пропустить:

        if (i==7 || i==8 || i==9 || i==10 || i==13 || i==27)
           cout<<i<<":";
       else
          cout<<i<<":"<<char(i);

 //вывод в 6 столбиков:

        if (i%6==0) cout << endl;
    }
   

Комментариев нет:

Отправить комментарий