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

From Ilianko
Line 80: Line 80:
  
 
== Ползване Utf-8 в C и Linux ==
 
== Ползване Utf-8 в C и Linux ==
 +
'''Задача 5.''' Изпълнете програмата в терминал. Изпълнете програмата като изтриете функцията ''setlocale()''. Изпълнете командата ''locale'' в терминалния прозорец, за да видите регионалните настройки.
  
 
<code><pre>
 
<code><pre>

Revision as of 09:37, 9 April 2011

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

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

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

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

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

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

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

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

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

Удобството на клавиатурата е комплексен и субективен критерий. Клавиатурите се различават

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

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

Управление

Клавиатурата има несложен интерфейс към компютъра. С всяко натискане или отпускане на бутон се изпраща код от клавиатурата, който съдържа позицията на бутона и състоянието. На Фиг. 2 е показана принципна схема на матрицата на клавиатурата. Всеки ключ уникално свързва двойка проводници съответно по един от хоризонталата и вертикалата. Микропроцесорът (т.н. контролер на клавиатурата) открива кой бутон е натиснат като последователно сканира всяка двойка линии. Контролерът преобразува затварянето на контактора в код подходящ за интерпретиране от компютъра.

Фиг. 2

Клавиатурен интерфейс

Най-често клавиатурата се включва към компютъра чрез специализирания интерфейс PS/2 или чрез USB. PS/2 е сравнително остарял и при по-новите машини и мобилните компютри може да липсва. Независимо кой физически интерфейс се ползва данните са идентични и след пристигането им до компютъра се изпращат към вградения на дънната платка клавиатурен контролер. Контролерът сигнализира на системния процесор чрез линия за прекъсване IRQ1. Може да се подават и данни от компютъра към клавиатурата. При стартиране на компютъра USB клавиатурата първоначално се управлява от драйверите на BIOS-a, затова трябва да се провери дали е разрешено ползването USB клавиатура. В последствие по време на зареждането на операционната система управлението се поема от драйверите на операционната система

Клавиатурна подредба (keyboard layout)

QWERTY

Клавиатурна подредба на компютърната клавиатура е разположението на символите отговарящи на всеки един от бутоните. Тя е взаимствана от подредбата на клавишите на ръчните пишещи машини. Затова най-често използваната клавиатурна подредба е базирана на подредбата QWERTY (Кю-ЕР-ТИ), която типична за повечето англоезични машинописни клавиатури. Почти всички езици имат собствен стандарт за подредба на бутоните. Например в немската клавиатура мястото на буквите Z и Y e разменено и съществуват още два символа Ö и Ü. В България се използват QWERTY клавиатури, като на същите клавиши с друг цвят са нанесени буквите от кирилицата и други символи от подредбата по БДС. В практиката обаче се използва и така наречената фонетична подредба*, при която има звуково съответствие на почти всички букви от кирилицата и латиницата, като се основава на подредбата QWERTY.

  • В момента съществуват два вида фонетични подредби – стандартизирана по БДС и „оригинална” фонетична подредба (1).

Избор на клавиатурна подредба при Windows става от менюто за регионални и езикови настройки. При Linux с GNOME графична среда избора на клавиатурна подредба от настройките на клавиатурата.

Кодиране на символите

Кодиране на символите (кодови таблици, character encoding, character set (charset) e система от кодове, която свързва всеки символ с някакво друга величина, например - естествено число, осмично число или електрически импулси с цел пренасянето му или съхраняването му в електронен вид. Пример за кодирането са Морзовата азбука и ASCII кода. Поради различията в символите на различните езици съществува голямо разнообразие от кодови таблици - примерно, ако искаме да използване кирилица и латиница, гръцки букви и т.н. Например най-често ползваната кодова таблица стандартизирана от Windows при използване на латиница и кирилица е windows-1251. В този случай за кодовете на латиница са същите, като при ASCII кода (това се прави и при почти всички други кодирания, с цел обратна съсвместимост). Използването на много различни кодирания създава големи трудности при изполването на мултиезични програми, което налага разработка на модул за превеждане между различните кодирания.

utf

Примерите за такива програми са уеб браузърите. Ако не е указано правилно, кое е използването кодиране на символите, страницата ще се визуализира с „маймунски символи” или въпросителни. В този случай може ръчно да се зададе какво кодиране да се използва от настройките за визуализация (View -> encoding) С цел премахване на неудобството е разработен Unicode ( ISO 10646, Universal Character Set UCS), стандартът за представяне и обработка на текст от почти всички системи за писане. В момента Unicode включва повече от 107,000 символа описващи 90 писмености. UCS (Unicode) описва връзката между кода и символа, UTF-8 и UTF-16 са най-често използваните методи за програмна реализация на това кодиране. Utf-8/16 са с променлива дължина от 1 до 4 байта. Всички модерните операционни системи поддържат UTF-8 и UTF-16 и е препоръчително да се използват при разработка на нови софтуерни приложения.

U-00000000 – U-0000007F:0xxxxxxx
U-00000080 – U-000007FF:110xxxxx 10xxxxxx
U-00000800 – U-0000FFFF:1110xxxx 10xxxxxx 10xxxxxx
U-00010000 – U-001FFFFF:11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
U-00200000 – U-03FFFFFF:111110xx 10xxxxxx 10xxxxxx 10xxxxxx10xxxxxx
U-04000000 – U-7FFFFFFF:1111110x 10xxxxxx 10xxxxxx 10xxxxxx10xxxxxx 10xxxxxx

Набор от символи и колация (сравняване)

Набора от символи са самите символи и тяхното кодиране, а колацията е набор от правила за сравнение на символите. Например: Да предположим, че имаме азбука от четири символа 'A', 'Б', 'a', 'б'. Даваме на всяка буква номер 'A' = 0, 'Б' = 1, 'a' = 2, 'б' = 3. Буквата ‘А’ е символа, числото ‘0’ е кодът на символа. Комбинацията от всички четири букви и техните кодове се нарича кодиране на символите (encoding). Сега да предположим, че искаме да сравним стойностите на двата стринга, 'A' and 'Б'. Най-лесният начин да се направи това е да се провери кодът на символите: 0 за ‘А’ и 1 за ‘Б’. Поради това, че 0 е по-малко от 1, казваме ‘А’ е по-малко от ‘Б’. Това, което току що направихме е прилагане на колация върху нашия набор от символи. Колацията е набор от правила (в случая само едно правило) за сравнение на кодовете на символите. Гореспоменатото правило е най-простата от всички колации и се нарича бинарна колация (binary collation – бинарно сравняване). Но ако искаме да кажем, че малките и големите букви са еднозначни? Тогава имаме най-малко две правила:(1) разглеждане на малките букви ‘а’ и ‘б’ като еквивалентни на ‘А’ и ‘Б’; (2) сравняване на кодовете. Това се нарича „независимо от големината на буквата сравнение” ( case insensitive collation). Както видяхме в предходната подточка в реалния свят символите са много повече, а от тук и правилата за сравнение между тях също.

Други настройки.

AT – клавиатурите имат програмируеми настройки на повторенията при задържане и време на закъснение при задръжка. Времето на задръжка е от 0,25 до 1 секунда. Брой повторения при натиснат бутон е от 2 до 30 за секунда. Под Windows тези настройки се направят с командата „mode” или от контролния панел, като се избере клавиатурата. Пример: c:/> mode con: rate=31 delay=0 ще зададе максимален брой символи в секунда и минимална задръжка. c:/>mode con: rate=0 delay=3 ще зададе минимален брой символи и максимална задръжка.

Задачи

Unicode, ISO 10646, Universal Character Set

1. Да се добави българска фонетична клавиатурна подредба.

2. Да се настрои windows бутона да сменя клавиатурните подредби

3. Да се създадат четери html страници...

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

и да се запише с кодиране utf-8, windows-1251

Какво е Utf-8?

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

Задача 5. Изпълнете програмата в терминал. Изпълнете програмата като изтриете функцията 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;

}
/*********************************************************************\
 * 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","bannan","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;
}

Задача. 5 Преработете програмата по-горе да работи със стрингове на български.

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