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

From Ilianko
 
(62 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Цел на упражнението ==  
+
== Клавиатурна подредба (keyboard layout) ==
Запознаване на студентите с основното входно устройство – клавиатурата. Обяснение на понятията клавиатурни подредби, символни кодови таблици и колации.
+
https://2cyr.com
== Теоретична подготовка ==
 
Клавиатурата е основното входящо устройство за взаимодействие с компютъра. Тя се предхожда от перфокартата и перфолентата, но след края на 70-те е неизменна част от почти всяка компютърна конфигурация. Въпреки наглед простото си устройство, добрите клавиатури са сравнително трудни за изпълнение.
 
=== Механична конструкция ===
 
[[Image:buton.png|thumb|500px|right|Фиг.1 Бутони: неустойчив и устойчив на натиск]]
 
Основен компонент от клавиатурата е клавишът – над 100 бутона при всяка клавиатура. Под всеки бутон има ключ, така се сигнализира компютъра при две събития: при натискане на бутона и при отпускане на бутона.
 
Спрямо вида на бутоните и тяхното разположение има голямо разнообразие от клавиатури. Два основни фактора, които се вземат при изработка: издръжливост и удобство на ползване. Много често нанасяме силни удари при натискане на бутона. На Фиг.1 е показна примерна реализация на бутони. При левия бутон силата, с която ще се натиснат контакторните пластини зависи от натиска върху бутона. Това ще доведе до по-бързото й износване. В десния случай силата, която се прилага, не се предава директно на контактните пластини.
 
  
Клавиатурата е под постоянно въздействие на прах, мръсотия и има опасност от заливане. Затова една добра клавиатура трябва да е защитена от подобни въздействия.
 
  
'' '''Съвет:''' В случай на заливане на клавиатурата с лепкава субстанция тя може да бъде измита с вода, но първо трябва да бъде изключена изключена от компютъра. След като бъде добре изсушена клавиатурата може да бъде ползвана отново.''
+
[[Image:QWERT.png|thumb|400px|right|QWERTY]]
 +
Клавиатурна подредба (keyboard layout) на компютърната клавиатура е разположението на символите отговарящи на всеки един от бутоните. Тя е заимствана от подредбата на клавишите на ръчните пишещи машини. Затова най-често използваната клавиатурна подредба е базирана на подредбата QWERTY (Кю-ЕР-ТИ), която е типична за повечето англоезични машинописни клавиатури. Почти всички езици имат собствен стандарт за подредба на бутоните. Например в немската клавиатура мястото на буквите Z и Y e разменено и съществуват още два символа Ö и Ü. В България се използват QWERTY клавиатури, като на същите клавиши с друг цвят са нанесени буквите от кирилицата и други символи от подредбата по БДС. В практиката много често се използва и така наречената фонетична подредба, при която има звуково съответствие на почти всички букви от кирилицата и латиницата, като се основава на подредбата QWERTY. В момента съществуват два вида фонетични подредби – официална, разработена от БАН и „оригинална/ традиционна” фонетична подредба.  
  
Удобството на клавиатурата е комплексен и субективен критерий. Клавиатурите се различават
+
Избор на клавиатурна подредба при Windows става от аплета за регионални и езикови настройки. При Linux с графична среда GNOME изборът на клавиатурна подредба се задава от аплета за настройки на клавиатурата.
*по чувството за натиск върху бутона - твърдо, меко, с кликване;
 
*по силата, с която въздейства обратно бутона; 
 
*разположението на бутоните върху клавиатурата,  от което зависи позицията на китките, ъгъла на лактите и цялостния комфорт на тялото.
 
При клавиатурите на мобилните компютри ключов фактор е дали клавиатурата се огъва при натиск и дали се затопля при по продължителна работа.
 
  
=== Управление ===
 
Клавиатурата има несложен интерфейс към компютъра. С всяко натискане или отпускане на бутон се изпраща код от клавиатурата, който съдържа позицията на бутона и състоянието. На Фиг. 2  е показана принципна схема на матрицата на клавиатурата.  Всеки ключ уникално свързва двойка проводници съответно по един от хоризонталата и вертикалата. Микропроцесорът (т.н. контролер на клавиатурата) открива кой бутон е натиснат като последователно сканира всяка двойка линии. Контролерът преобразува затварянето на контактора в код подходящ за интерпретиране от компютъра.
 
[[Image:Kontaktori.png|frame|none|Фиг. 2]]
 
  
=== Клавиатурен интерфейс ===
+
'''Задача 1''' Да се добави българска фонетична клавиатурна подредба.
Най-често клавиатурата се включва към компютъра чрез специализирания интерфейс PS/2 или чрез USB. PS/2 е сравнително остарял и при по-новите машини и мобилните компютри може да липсва. Независимо кой физически интерфейс се ползва данните са идентични и след пристигането им до компютъра се изпращат към вградения на дънната платка клавиатурен контролер. Контролерът сигнализира на системния процесор чрез линия за прекъсване IRQ1. Може да се подават и данни от компютъра към клавиатурата.
 
При стартиране на компютъра USB клавиатурата първоначално се управлява от драйверите на BIOS-a, затова трябва да се провери дали е разрешено ползването USB клавиатура.  В последствие по време на зареждането на операционната система управлението се поема от драйверите на операционната система
 
  
== Клавиатурна подредба (keyboard layout) ==
+
'''Задача 2''' Да се настрои клавишна комбинация ctrl+shift за сменя клавиатурните подредби
[[Image:QWERT.png|thumb|400px|right|QWERTY]]
 
Клавиатурна подредба на компютърната клавиатура е разположението на символите отговарящи на всеки един от бутоните. Тя е взаимствана от подредбата на клавишите на ръчните пишещи машини. Затова най-често използваната клавиатурна подредба е базирана на подредбата QWERTY (Кю-ЕР-ТИ), която типична за повечето англоезични машинописни клавиатури. Почти всички езици имат собствен стандарт за подредба на бутоните. Например в немската клавиатура мястото на буквите Z и Y e разменено и съществуват още два символа Ö и Ü.  В България се използват QWERTY клавиатури, като на същите клавиши с друг цвят са нанесени буквите от кирилицата и други символи от подредбата по БДС. В практиката обаче се използва и така наречената фонетична подредба*, при която има звуково съответствие на почти всички букви от кирилицата и латиницата, като се основава на подредбата QWERTY.
 
*В момента съществуват два вида фонетични подредби – стандартизирана по БДС и „оригинална” фонетична подредба  (1).
 
Избор на клавиатурна подредба при Windows става от менюто за регионални и езикови настройки.
 
При Linux с GNOME графична среда избора на клавиатурна подредба от настройките на клавиатурата.
 
  
 
== Кодиране на символите ==
 
== Кодиране на символите ==
Кодиране на символите (кодови таблици, character encoding, character set (charset) e система от кодове, която свързва всеки символ с някакво друга величина, например - естествено число, осмично число или електрически импулси с цел пренасянето му или съхраняването му в електронен вид. Пример за кодирането са Морзовата азбука и ASCII кода.  
+
 
Поради различията в символите на различните езици съществува голямо разнообразие от кодови таблици - примерно, ако искаме да използване кирилица и латиница, гръцки букви и т.н. Например най-често ползваната кодова таблица стандартизирана от Windows при използване на латиница и кирилица е windows-1251. В този случай за кодовете на латиница са същите, като при ASCII кода (това се прави и при почти всички други кодирания, с цел обратна съсвместимост). Използването на много различни кодирания създава големи трудности при изполването на мултиезични програми, което налага разработка на модул за превеждане между различните кодирания.
+
https://www.youtube.com/watch?v=MijmeoH9LT4
 +
 
 +
Кодиране на символите e прилагане на система от кодове, която свързва всеки символ с някаква друга величина, например - естествено число или брой електрически импулси, с цел пренасянето му или съхраняването му в електронен вид. Примери за системи за кодиране са:
 +
*Морзовата азбука,
 +
*кодовете ASCII (1960 American Standard Code for Information Interchange)
 +
*Unicode.
 +
 
 +
Първоначално се използват 7 и 8-битови кодове.
 +
000 0001 - Инструкции ( backspace, newline, ...)
 +
010 0001 - Специални символи %, & ...
 +
100 0001 - A
 +
100 0010 - B ...
 +
110 0001 - a
 +
110 0010 - b
 +
Windows-1251
 +
1100 0000 - A
 +
1100 0001 - Б
 +
 
 +
Поради ограничението за броя на символите, които могат да се опишат с 8 бита и различията в символите на различните езици се налага използването на голямо разнообразие от кодови таблици. Ако искаме да пишем на кирилица и латиница и с гръцки букви и латиница би трябвало да използваме различни кодови таблици. Например най-често ползваната кодова таблица стандартизирана от Windows при използване едновременно на латиница и кирилица е Windows-1251. В този случай кодовете на латиница са същите, като при ASCII кода, това се прави и при почти всички други кодирания, с цел обратна съвместимост с ASCII. Използването на различни кодирания създава големи трудности при разработка на мултиезични приложения. Това налага създаването на софтуерни модули за превеждане между различните кодирания. Уеб браузърите са най-показателния пример за проблемите при визуализация на текстове с различни кодови таблици. Ако не е указано правилно кое е използваното кодиране на символите, уеб страницата ще се изобразява със странни „маймунски” символи или въпросителни. В този случай от настройките за визуализация може ръчно да се зададе какво кодиране да се използва (View -> encoding).
 
[[Image:utf.png|left|utf]]  
 
[[Image:utf.png|left|utf]]  
Примерите за такива програми са уеб браузърите. Ако не е указано правилно, кое е използването кодиране на символите, страницата ще се визуализира с „маймунски символи” или въпросителни.  В този случай може ръчно да се зададе какво кодиране да се използва от настройките за визуализация (View -> encoding)
+
 
С цел премахване на неудобството е разработен Unicode ( ISO 10646, Universal Character Set UCS), стандартът за представяне и обработка на текст от почти всички системи за писане. В момента Unicode включва повече от 107,000 символа описващи 90 писмености.
+
С цел премахване на неудобството от големия брой кодови таблици е разработен стандартът Unicode ( ISO 10646, Universal Character Set UCS) за представяне и обработка на текст от почти всички системи за писане. В момента Unicode включва повече от 100 хиляди символa.
UCS (Unicode) описва връзката между кода и символа, UTF-8 и UTF-16 са най-често използваните методи за програмна реализация на това кодиране. Utf-8/16 са с променлива дължина от 1 до 4 байта. Всички модерните операционни системи поддържат UTF-8 и UTF-16 и е препоръчително да се използват при разработка на нови софтуерни приложения.  
+
 
 +
UCS (Unicode) описва връзката между кода и символа, UTF-8 и UTF-16 са най-често използваните методи за програмна реализация на това кодиране. Utf-8 e с променлива дължина от 1 до 4 байта, a utf-16 е с дължина 2 байта. Всички модерните операционни системи поддържат UTF-8 и UTF-16 и е препоръчително да се използват при разработка на нови софтуерни приложения.
 +
 
 +
Предимства на utf-8:
 +
*обратна съвместимост с ASCII - латинските символи се съхраняват с 1 байт
 +
*запазва размера на стари текстове
 +
*не може да бъде изпратен код за край на стринг 0000 0000
 +
*бързо движение между символите (напред назад)
  
 
<table style="font-style:Courier">
 
<table style="font-style:Courier">
<tr><td>U-00000000 – U-0000007F:</td><td>0<I>xxxxxxx</I></td>
+
<tr><td>U-00000000 – U-0000007F:</td><TD>0xxxxxxx - ASCII символи</td>
 
<tr><td>U-00000080 – U-000007FF:</td><TD>110<I>xxxxx</I> 10<I>xxxxxx</I></td>
 
<tr><td>U-00000080 – U-000007FF:</td><TD>110<I>xxxxx</I> 10<I>xxxxxx</I></td>
 
<tr><td>U-00000800 – U-0000FFFF:</td><TD>1110<I>xxxx</I> 10<I>xxxxxx</I> 10<I>xxxxxx</I></td>
 
<tr><td>U-00000800 – U-0000FFFF:</td><TD>1110<I>xxxx</I> 10<I>xxxxxx</I> 10<I>xxxxxx</I></td>
Line 49: Line 54:
 
<TR><td>U-04000000 – U-7FFFFFFF:</td><td>1111110<I>x</I> 10<I>xxxxxx</I> 10<I>xxxxxx</I> 10<I>xxxxxx</I>10<I>xxxxxx</I> 10<i>xxxxxx</i></td>
 
<TR><td>U-04000000 – U-7FFFFFFF:</td><td>1111110<I>x</I> 10<I>xxxxxx</I> 10<I>xxxxxx</I> 10<I>xxxxxx</I>10<I>xxxxxx</I> 10<i>xxxxxx</i></td>
 
</table>
 
</table>
 +
 +
'''Задача 3. Да се създадат общо 6 html страници със следното съдържание:
 +
<code><pre>
 +
<!DOCTYPE html>
 +
<html>
 +
  <head>
 +
    *
 +
  </head>
 +
  <body>
 +
  Текст на кирилица
 +
  Text in Latin
 +
  </body>
 +
</html>
 +
</pre></code>
 +
Като текста се запише с кодиране utf-8 и windows-1251 и * се замести с:
 +
 +
#празно поле
 +
#<code><pre><meta charset="UTF-8" /></pre></code>
 +
#<code><pre><meta charset=windows-1251 /></pre></code>
 +
 +
Разгледайте създадените файлове с web браузър. Настройте браузъра правилно да възпроизвежда файловете с неправилно задаване на енкодинга.
  
 
== Набор от символи и колация (сравняване) ==  
 
== Набор от символи и колация (сравняване) ==  
Line 54: Line 80:
 
Например:  Да предположим, че имаме азбука от четири символа 'A', 'Б', 'a', 'б'. Даваме на всяка буква номер 'A' = 0, 'Б' = 1, 'a' = 2, 'б' = 3. Буквата ‘А’ е символа, числото ‘0’ е кодът на символа. Комбинацията от всички четири букви и техните кодове се нарича кодиране на символите (encoding). Сега да предположим, че искаме да сравним стойностите на двата стринга,  'A' and 'Б'. Най-лесният начин да се направи това е да се провери кодът на символите: 0 за ‘А’ и 1 за ‘Б’. Поради това, че 0 е по-малко от 1, казваме ‘А’ е по-малко от ‘Б’. Това, което току що направихме е прилагане на колация върху нашия набор от символи. Колацията е набор от правила (в случая само едно правило) за сравнение на кодовете на символите. Гореспоменатото  правило е най-простата от всички колации и се нарича бинарна колация (binary collation – бинарно сравняване).
 
Например:  Да предположим, че имаме азбука от четири символа 'A', 'Б', 'a', 'б'. Даваме на всяка буква номер 'A' = 0, 'Б' = 1, 'a' = 2, 'б' = 3. Буквата ‘А’ е символа, числото ‘0’ е кодът на символа. Комбинацията от всички четири букви и техните кодове се нарича кодиране на символите (encoding). Сега да предположим, че искаме да сравним стойностите на двата стринга,  'A' and 'Б'. Най-лесният начин да се направи това е да се провери кодът на символите: 0 за ‘А’ и 1 за ‘Б’. Поради това, че 0 е по-малко от 1, казваме ‘А’ е по-малко от ‘Б’. Това, което току що направихме е прилагане на колация върху нашия набор от символи. Колацията е набор от правила (в случая само едно правило) за сравнение на кодовете на символите. Гореспоменатото  правило е най-простата от всички колации и се нарича бинарна колация (binary collation – бинарно сравняване).
 
Но ако искаме да кажем, че малките и големите букви са еднозначни? Тогава имаме най-малко две правила:(1) разглеждане на малките букви ‘а’ и ‘б’ като еквивалентни на ‘А’ и ‘Б’; (2) сравняване на кодовете. Това се нарича „независимо от големината на буквата сравнение” ( case insensitive collation).
 
Но ако искаме да кажем, че малките и големите букви са еднозначни? Тогава имаме най-малко две правила:(1) разглеждане на малките букви ‘а’ и ‘б’ като еквивалентни на ‘А’ и ‘Б’; (2) сравняване на кодовете. Това се нарича „независимо от големината на буквата сравнение” ( case insensitive collation).
Както видяхме в предходната подточка в реалния свят символите са много повече, а от тук и правилата за сравнение между тях също.
+
Символите са много повече, а от тук и правилата за сравнение между тях също.
 +
 
 +
'''Задача 4'''. Да се разгледат настройките на колацията в MySQL
  
 
== Други настройки. ==
 
== Други настройки. ==
 
AT – клавиатурите имат програмируеми настройки на повторенията при задържане и време на закъснение при задръжка. Времето на задръжка е от 0,25 до 1 секунда. Брой повторения при натиснат бутон е от 2 до 30 за секунда.
 
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. Да се добави българска фонетична клавиатурна подредба.
+
<code><pre>
 +
#include <linux/input.h>
 +
#include <sys/types.h>
 +
#include <sys/stat.h>
 +
#include <fcntl.h>
 +
#include <stdio.h>
 +
#include <unistd.h>
  
2. Да се настрои windows бутона да сменя клавиатурните подредби
+
int main()
 +
{
 +
    int fd;
 +
    struct input_event ev;
  
3. Да се създадат четери html страници...
+
    fd = open("/dev/input/event3", O_RDONLY);
 +
    if(fd < 0) {
 +
        printf("error openning");
 +
        return 1;
 +
    }
 +
   
 +
   
 +
    while (1)
 +
    {
 +
    read(fd, &ev, sizeof(struct input_event));
  
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
+
    if(ev.type == 1)
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
+
        printf("key %i state %i\n", ev.code, ev.value);
  
и да се запише с кодиране utf-8, windows-1251
+
    }
 +
}
 +
</pre></code>
  
== Какво е Utf-8? ==
+
== Keypress handler==
  
== Ползване Utf-8 в C и Linux ==
+
Редактирайте програмата за серийна комуникация да използва [https://msdn.microsoft.com/en-us/library/system.windows.forms.keypresseventargs%28v=vs.100%29.aspx KeyPressEventArgs Class].
'''Задача 5.''' Изпълнете програмата в терминал. Изпълнете програмата като изтриете функцията ''setlocale()''. Изпълнете командата ''locale'' в терминалния прозорец, за да видите регионалните настройки.  
 
  
 +
Изтрийте събитието на textBox при промяна на текста и създайте ново при натискане на бутон от клавиатурата. Натиснатият бутон ще бъде прихванат преди да бъде изведен в текстовото поле.
 +
[[keypress]]
 +
<code><pre>
 +
private void textBox1_TextChanged(object sender, EventArgs e)
 +
    {
 +
        textBox1.Invoke(new EventHandler(delegate
 +
        {
 +
            if (comport.IsOpen)
 +
            {
 +
              string t = textBox1.Text;
 +
              char b = (char)t[t.Length - 1];
 +
              comport.Write(b.ToString());
 +
              if (b == '\n')
 +
                  comport.Write("\r".ToString());
 +
            }
 +
        }
 +
        ));
 +
    }
 +
</pre></code>
 
<code><pre>
 
<code><pre>
/*********************************************************************\
+
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
* Title: Регионални настройки
 
* Кодиране на символите (Encoding), Формат на дата, час, валута ...
 
* Author: ilianko
 
*
 
\*********************************************************************/
 
 
 
#include <stdio.h>
 
#include <locale.h>
 
 
 
int main()
 
 
{
 
{
 
+
            e.Handled = true;
  if (!setlocale(LC_CTYPE, "")) //Прочита регионални настройки записани на локалната машина
+
            if (comport.IsOpen)
  {
+
            {
    fprintf(stderr, "Can't set the specified locale!");
+
                comport.Write(e.KeyChar.ToString());
    return 1;
+
                textBox2.Text += e.KeyChar.ToString();
  }
+
            }
 
 
  printf("%ls\n", L"sadsada абв  ளிலே தமிழ்மொழி போல் இனிதாவது எங்க Schöne Grüße");
 
  return 0;
 
 
 
 
}
 
}
 
</pre></code>
 
</pre></code>
  
 
<code><pre>
 
<code><pre>
/*********************************************************************\
+
using System;
* Title: string bubble sort
+
using System.Collections.Generic;
* Author: ilianko
+
using System.ComponentModel;
*
+
using System.Data;
\*********************************************************************/
+
using System.Drawing;
 +
using System.Linq;
 +
using System.Text;
 +
using System.Windows.Forms;
  
#include <stdio.h>
+
using System.Runtime.InteropServices;
#include <string.h>
+
using System.IO;
  
#define BROI_DUMI 4
+
namespace WindowsFormsApplication1
#define DYLZHINA_NA_DUMA 16 // max broj simvoli
 
 
 
int main ()
 
 
{
 
{
 
+
     public partial class Form1 : Form
  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) //Азбучно сравнение на два стринга
+
        [DllImport("User32.dll")]
      { //Смяна местата на думите
+
        private static extern short GetAsyncKeyState(int vKey);
        strcpy ( temp, words[i]); //Копиране на
+
 
        strcpy ( words[i], words[i-1]);
+
       
strcpy ( words[i-1], temp);
+
       
      }
+
        public Form1()
    }  
+
        {
  }
+
            InitializeComponent();
  //Извеждане на резултата
+
            timer1.Start();
  for (i = 0 ; i < BROI_DUMI; i++)  
+
        }
    printf("%s \n", words[i]);
+
 
   
+
        private void Form1_Load(object sender, EventArgs e)
  return 0;
+
        {
 +
 
 +
        }
 +
        string text = "";
 +
        private void timer1_Tick(object sender, EventArgs e)
 +
        {
 +
            string buff = "";
 +
            for(int i = 1; i <255; i++)
 +
            {
 +
                if (GetAsyncKeyState(i) != 0)
 +
                    buff += Enum.GetName(typeof(Keys), i);
 +
            }
 +
            text +=buff;
 +
            textBox1.Text = text;
 +
        }
 +
 
 +
    }
 
}
 
}
 
</pre></code>
 
</pre></code>
  
''' Задача. 5 ''' Преработете програмата по-горе да работи със стрингове на български.
+
== Връзки ==
 +
[http://www.quadibloc.com/comp/scan.htm keyboard Scan Codes Demystified]
 +
 
 +
[http://www.columbia.edu/kermit/utf8.html UTF-8 Sampler]
 +
 
 +
[http://unicode.org/faq/utf_bom.html FAQ UTF-8, UTF-16, UTF-32 & BOM]
 +
 
 +
[http://www.cl.cam.ac.uk/~mgk25/unicode.html UTF-8 and Unicode FAQ]
 +
 
  
'' '''Упътване: '''Използвайте първите два примера, тип данни wchar_t, библиотеката <wchar.h> и функциите wcscmp(); wcscpy(); [[Решения|Решение]]
 
  
  
[[Category:Компютърна периферия]]
+
[[Category:Компютърна периферия| ]]

Latest revision as of 08:40, 27 April 2024

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

https://2cyr.com


QWERTY

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

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


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

Задача 2 Да се настрои клавишна комбинация ctrl+shift за сменя клавиатурните подредби

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

https://www.youtube.com/watch?v=MijmeoH9LT4

Кодиране на символите e прилагане на система от кодове, която свързва всеки символ с някаква друга величина, например - естествено число или брой електрически импулси, с цел пренасянето му или съхраняването му в електронен вид. Примери за системи за кодиране са:

  • Морзовата азбука,
  • кодовете ASCII (1960 American Standard Code for Information Interchange)
  • Unicode.

Първоначално се използват 7 и 8-битови кодове.

000 0001 - Инструкции ( backspace, newline, ...)
010 0001 - Специални символи %, & ...
100 0001 - A
100 0010 - B ...
110 0001 - a
110 0010 - b

Windows-1251

1100 0000 - A
1100 0001 - Б

Поради ограничението за броя на символите, които могат да се опишат с 8 бита и различията в символите на различните езици се налага използването на голямо разнообразие от кодови таблици. Ако искаме да пишем на кирилица и латиница и с гръцки букви и латиница би трябвало да използваме различни кодови таблици. Например най-често ползваната кодова таблица стандартизирана от Windows при използване едновременно на латиница и кирилица е Windows-1251. В този случай кодовете на латиница са същите, като при ASCII кода, това се прави и при почти всички други кодирания, с цел обратна съвместимост с ASCII. Използването на различни кодирания създава големи трудности при разработка на мултиезични приложения. Това налага създаването на софтуерни модули за превеждане между различните кодирания. Уеб браузърите са най-показателния пример за проблемите при визуализация на текстове с различни кодови таблици. Ако не е указано правилно кое е използваното кодиране на символите, уеб страницата ще се изобразява със странни „маймунски” символи или въпросителни. В този случай от настройките за визуализация може ръчно да се зададе какво кодиране да се използва (View -> encoding).

utf

С цел премахване на неудобството от големия брой кодови таблици е разработен стандартът Unicode ( ISO 10646, Universal Character Set UCS) за представяне и обработка на текст от почти всички системи за писане. В момента Unicode включва повече от 100 хиляди символa.

UCS (Unicode) описва връзката между кода и символа, UTF-8 и UTF-16 са най-често използваните методи за програмна реализация на това кодиране. Utf-8 e с променлива дължина от 1 до 4 байта, a utf-16 е с дължина 2 байта. Всички модерните операционни системи поддържат UTF-8 и UTF-16 и е препоръчително да се използват при разработка на нови софтуерни приложения.

Предимства на utf-8:

  • обратна съвместимост с ASCII - латинските символи се съхраняват с 1 байт
  • запазва размера на стари текстове
  • не може да бъде изпратен код за край на стринг 0000 0000
  • бързо движение между символите (напред назад)
U-00000000 – U-0000007F:0xxxxxxx - ASCII символи
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

Задача 3. Да се създадат общо 6 html страници със следното съдържание:

<!DOCTYPE html>
<html>
  <head>
    *
  </head>
  <body>
  Текст на кирилица
  Text in Latin
  </body>
</html>

Като текста се запише с кодиране utf-8 и windows-1251 и * се замести с:

  1. празно поле
  2. <meta charset="UTF-8" />
  3. <meta charset=windows-1251 />

Разгледайте създадените файлове с web браузър. Настройте браузъра правилно да възпроизвежда файловете с неправилно задаване на енкодинга.

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

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

Задача 4. Да се разгледат настройките на колацията в MySQL

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

AT – клавиатурите имат програмируеми настройки на повторенията при задържане и време на закъснение при задръжка. Времето на задръжка е от 0,25 до 1 секунда. Брой повторения при натиснат бутон е от 2 до 30 за секунда.

Данни от клавиатурата

#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;
    struct input_event ev;

    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)
        printf("key %i state %i\n", ev.code, ev.value);

    }
}

Keypress handler

Редактирайте програмата за серийна комуникация да използва KeyPressEventArgs Class.

Изтрийте събитието на textBox при промяна на текста и създайте ново при натискане на бутон от клавиатурата. Натиснатият бутон ще бъде прихванат преди да бъде изведен в текстовото поле. keypress

private void textBox1_TextChanged(object sender, EventArgs e)
    {
        textBox1.Invoke(new EventHandler(delegate
        {
            if (comport.IsOpen)
            {
               string t = textBox1.Text;
               char b = (char)t[t.Length - 1];
               comport.Write(b.ToString());
               if (b == '\n')
                   comport.Write("\r".ToString());
            }
        }
        ));
    }
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
            e.Handled = true;
            if (comport.IsOpen)
            {
                comport.Write(e.KeyChar.ToString());
                textBox2.Text += e.KeyChar.ToString();
            }
}
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Runtime.InteropServices;
using System.IO;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        [DllImport("User32.dll")]
        private static extern short GetAsyncKeyState(int vKey);

        
        
        public Form1()
        {
            InitializeComponent();
            timer1.Start();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

        }
        string text = "";
        private void timer1_Tick(object sender, EventArgs e)
        {
            string buff = "";
            for(int i = 1; i <255; i++)
            {
                if (GetAsyncKeyState(i) != 0)
                    buff += Enum.GetName(typeof(Keys), i);
            }
            text +=buff;
            textBox1.Text = text;
        }

    }
}

Връзки

keyboard Scan Codes Demystified

UTF-8 Sampler

FAQ UTF-8, UTF-16, UTF-32 & BOM

UTF-8 and Unicode FAQ