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

From Ilianko
(34 intermediate revisions by the same user not shown)
Line 1: Line 1:
== Цел на упражнението ==
+
== Клавиатурна подредба (keyboard layout) ==
Запознаване на студентите с основното входно устройство – клавиатурата. Обяснение на понятията клавиатурни подредби, символни кодови таблици и колации.
+
[[Image:QWERT.png|thumb|400px|right|QWERTY]]
== Теоретична подготовка ==
+
Клавиатурна подредба (keyboard layout) на компютърната клавиатура е разположението на символите отговарящи на всеки един от бутоните. Тя е заимствана от подредбата на клавишите на ръчните пишещи машини. Затова най-често използваната клавиатурна подредба е базирана на подредбата QWERTY (Кю-ЕР-ТИ), която е типична за повечето англоезични машинописни клавиатури. Почти всички езици имат собствен стандарт за подредба на бутоните. Например в немската клавиатура мястото на буквите Z и Y e разменено и съществуват още два символа Ö и Ü. В България се използват QWERTY клавиатури, като на същите клавиши с друг цвят са нанесени буквите от кирилицата и други символи от подредбата по БДС. В практиката много често се използва и така наречената фонетична подредба, при която има звуково съответствие на почти всички букви от кирилицата и латиницата, като се основава на подредбата QWERTY. В момента съществуват два вида фонетични подредби – официална, разработена от БАН и „оригинална/ традиционна” фонетична подредба.  
Клавиатурата е основното входящо устройство за взаимодействие с компютъра. Тя се предхожда от перфокартата и перфолентата, но след края на 70-те е неизменна част от почти всяка компютърна конфигурация. Въпреки наглед простото си устройство, добрите клавиатури са сравнително трудни за изпълнение.
 
=== Механична конструкция ===
 
[[Image:buton.png|thumb|500px|right|Фиг.1 Бутони: неустойчив и устойчив на натиск]]
 
Въпреки наглед простото си устройство, добрите клавиатури са сравнително трудни за изпълнение. Основен компонент от клавиатурата е клавишът – над 100 бутона при всяка клавиатура. Под всеки бутон има ключ, с него се сигнализира компютъра при две събития - при натискане на бутона и при отпускане на бутона. Спрямо вида на бутоните и тяхното разположение има голямо разнообразие от клавиатури.
 
Две основни характеристики, които се вземат предвид при изработката на клавиатурите са издръжливост и удобство на ползване.
 
Много често нанасяме силни удари при натискане на бутон. На Фиг.1 е показна примерна реализация на бутони. При левия бутон силата, с която ще се натиснат контакторните пластини, зависи от натиска върху бутона. Това ще доведе до по-бързото износване на клавиатурата. В десния случай силата, която се прилага, не се предава директно на контактните пластини.
 
  
Клавиатурата е под постоянно въздействие на прах, съществува и опасност от заливане с течност. Една добра клавиатура трябва да е устойчива при подобни въздействия.
+
Избор на клавиатурна подредба при Windows става от аплета за регионални и езикови настройки. При Linux с графична среда GNOME изборът на клавиатурна подредба се задава от аплета за настройки на клавиатурата.
  
'' '''Съвет:''' В случай на заливане на клавиатурата с лепкава субстанция тя може да бъде измита с вода, но първо трябва да бъде изключена изключена от компютъра. След като бъде добре изсушена клавиатурата може да бъде ползвана отново.''
 
  
Удобството на клавиатурата е комплексна и субективна мярка. В тази връзка клавиатурите се различават по:
+
'''Задача 1''' Да се добави българска фонетична клавиатурна подредба.
*чувството за натиск върху бутона - твърдо, меко, с кликване;
 
*силата, с която въздейства обратно бутона;
 
*разположението на бутоните върху клавиатурата, от което зависят позицията на китките, ъгълът на лактите и цялостният комфорт на тялото.
 
При мобилните компютри ключови характеристики са огъването на клавиатурата при натиск и затоплянето й при продължителна работа.
 
  
=== Управление ===
+
'''Задача 2''' Да се настрои клавишна комбинация ctrl+shift за сменя клавиатурните подредби
  
Най-често клавиатурата се включва към компютъра чрез специализирания интерфейс PS/2 (серийна синхронна връзка) или чрез USB интерфейс. PS/2 е сравнително остарял и при по-новите машини и мобилните компютри може да липсва.
+
== Кодиране на символите ==
  
Всяка клавиатура има вградено управление, което следи състоянието на бутоните. С всяко натискане или отпускане на бутон се генерира код, който се изпраща за интерпретиране от компютъра. Изпратеният код съдържа номера на натиснатия бутон и действието.
+
https://www.youtube.com/watch?v=MijmeoH9LT4
[[Image:Kontaktori.png|frame|none|Фиг. 2]]
 
  
Независимо кой физически интерфейс се ползва, данните са идентични и след пристигането им до компютъра се приемат от вградения на дънната платка клавиатурен контролер. Чрез линия за прекъсване IRQ1, контролерът сигнализира на системния процесор (CPU) за настъпилото събитие.  Може да се подават и данни от компютъра към клавиатурата.
+
Кодиране на символите e прилагане на система от кодове, която свързва всеки символ с някаква друга величина, например - естествено число или брой електрически импулси, с цел пренасянето му или съхраняването му в електронен вид. Примери за системи за кодиране са:
 +
*Морзовата азбука,  
 +
*кодовете ASCII (1960 American Standard Code for Information Interchange)
 +
*Unicode.
  
При стартиране на компютъра USB клавиатурата първоначално се управлява от драйверите на BIOS-a, затова трябва да се провери дали е разрешено ползването USB клавиатураВ последствие по време на зареждането на операционната система управлението се поема от драйверите на операционната система
+
Първоначално се използват 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 - Б
  
== Клавиатурна подредба (keyboard layout) ==
+
Поради ограничението за броя на символите, които могат да се опишат с 8 бита и различията в символите на различните езици се налага използването на голямо разнообразие от кодови таблици. Ако искаме да пишем на кирилица и латиница и с гръцки букви и латиница би трябвало да използваме различни кодови таблици. Например най-често ползваната кодова таблица стандартизирана от Windows при използване едновременно на латиница и кирилица е Windows-1251. В този случай кодовете на латиница са същите, като при ASCII кода, това се прави и при почти всички други кодирания, с цел обратна съвместимост с ASCII. Използването на различни кодирания създава големи трудности при разработка на мултиезични приложения. Това налага създаването на софтуерни модули за превеждане между различните кодирания. Уеб браузърите са най-показателния пример за проблемите при визуализация на текстове с различни кодови таблици. Ако не е указано правилно кое е използваното кодиране на символите, уеб страницата ще се изобразява със странни „маймунски” символи или въпросителни. В този случай от настройките за визуализация може ръчно да се зададе какво кодиране да се използва (View -> encoding).
[[Image:QWERT.png|thumb|400px|right|QWERTY]]
+
[[Image:utf.png|left|utf]]
Клавиатурна подредба на компютърната клавиатура е разположението на символите отговарящи на всеки един от бутоните. Тя е взаимствана от подредбата на клавишите на ръчните пишещи машини. Затова най-често използваната клавиатурна подредба е базирана на подредбата QWERTY (Кю-ЕР-ТИ), която типична за повечето англоезични машинописни клавиатури. Почти всички езици имат собствен стандарт за подредба на бутоните. Например в немската клавиатура мястото на буквите Z и Y e разменено и съществуват още два символа Ö и Ü.  В България се използват QWERTY клавиатури, като на същите клавиши с друг цвят са нанесени буквите от кирилицата и други символи от подредбата по БДС. В практиката обаче се използва и така наречената фонетична подредба*, при която има звуково съответствие на почти всички букви от кирилицата и латиницата, като се основава на подредбата QWERTY.  
 
*В момента съществуват два вида фонетични подредби – стандартизирана по БДС и „оригинална” фонетична подредба  (1).
 
Избор на клавиатурна подредба при Windows става от менюто за регионални и езикови настройки.
 
При Linux с GNOME графична среда избора на клавиатурна подредба от настройките на клавиатурата.
 
 
 
'''Задача 1''' Да се добави българска фонетична клавиатурна подредба.
 
  
'''Задача 2''' Да се настрои клавишна комбинация ctrl+shift за сменя клавиатурните подредби
+
С цел премахване на неудобството от големия брой кодови таблици е разработен стандартът 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:
Кодиране на символите (кодови таблици, character encoding, character set (charset) e система от кодове, която свързва всеки символ с някаквa друга величина, например -  естествено число, осмично число или електрически импулси с цел пренасянето му или съхраняването му в електронен вид. Пример за кодирането са Морзовата азбука и ASCII кода.
+
*обратна съвместимост с ASCII - латинските символи се съхраняват с 1 байт
Поради различията в символите на различните езици съществува голямо разнообразие от кодови таблици - примерно, ако искаме да използване кирилица и латиница, гръцки букви и т.н. Например най-често ползваната кодова таблица стандартизирана от Windows при използване на латиница и кирилица е windows-1251. В този случай за кодовете на латиница са същите, като при ASCII кода (това се прави и при почти всички други кодирания, с цел обратна съсвместимост). Използването на много различни кодирания създава големи трудности при изполването на мултиезични програми, което налага разработка на модул за превеждане между различните кодирания.
+
*запазва размера на стари текстове
[[Image:utf.png|left|utf]]
+
*не може да бъде изпратен код за край на стринг 0000 0000
Примерите за такива програми са уеб браузърите. Ако не е указано правилно, кое е използването кодиране на символите, страницата ще се визуализира с „маймунски символи” или въпросителни.  В този случай може ръчно да се зададе какво кодиране да се използва от настройките за визуализация (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 и е препоръчително да се използват  при разработка на нови софтуерни приложения.
 
  
 
<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 61: Line 54:
 
'''Задача 3. Да се създадат общо 6 html страници със следното съдържание:
 
'''Задача 3. Да се създадат общо 6 html страници със следното съдържание:
 
<code><pre>
 
<code><pre>
 +
<!DOCTYPE html>
 
<html>
 
<html>
 
   <head>
 
   <head>
Line 67: Line 61:
 
   <body>
 
   <body>
 
   Текст на кирилица
 
   Текст на кирилица
 +
  Text in Latin
 
   </body>
 
   </body>
 
</html>
 
</html>
 
</pre></code>
 
</pre></code>
като * се замести с:
+
Като текста се запише с кодиране utf-8 и windows-1251 и * се замести с:
 
 
1. празно поле
 
 
 
2.<code><pre>
 
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
 
</pre></code>
 
  
3.<code><pre>
+
#празно поле
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />
+
#<code><pre><meta charset="UTF-8" /></pre></code>
</pre></code>
+
#<code><pre><meta charset=windows-1251 /></pre></code>
и да се запишат с кодиране utf-8 и windows-1251.
 
  
Разгледайте създадените файлове с интернет браузър. Настройте браузъра правилно да възпроизвежда файловете с неправилно задаване на енкодинга.
+
Разгледайте създадените файлове с web браузър. Настройте браузъра правилно да възпроизвежда файловете с неправилно задаване на енкодинга.
  
 
== Набор от символи и колация (сравняване) ==  
 
== Набор от символи и колация (сравняване) ==  
Line 89: Line 77:
 
Например:  Да предположим, че имаме азбука от четири символа '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
 
'''Задача 4'''. Да се разгледат настройките на колацията в MySQL
Line 95: Line 83:
 
== Други настройки. ==
 
== Други настройки. ==
 
AT – клавиатурите имат програмируеми настройки на повторенията при задържане и време на закъснение при задръжка. Времето на задръжка е от 0,25 до 1 секунда. Брой повторения при натиснат бутон е от 2 до 30 за секунда.
 
AT – клавиатурите имат програмируеми настройки на повторенията при задържане и време на закъснение при задръжка. Времето на задръжка е от 0,25 до 1 секунда. Брой повторения при натиснат бутон е от 2 до 30 за секунда.
 
  
 
== Данни от клавиатурата ==
 
== Данни от клавиатурата ==
Line 130: Line 117:
 
</pre></code>
 
</pre></code>
  
== Какво е Utf-8? ==
+
== Keypress handler==
Реализация на Unicode стандарта
 
  
== Ползване Utf-8 в C и Linux ==
+
Редактирайте програмата за серийна комуникация да използва [https://msdn.microsoft.com/en-us/library/system.windows.forms.keypresseventargs%28v=vs.100%29.aspx KeyPressEventArgs Class].
'''Задача 6.'''
 
*Изпълнете програмата в терминал.
 
*Изпълнете програмата като изтриете функцията ''setlocale()''.  
 
*Изпълнете командата ''locale'' в терминалния прозорец, за да видите регионалните настройки.  
 
  
 +
Изтрийте събитието на textBox при промяна на текста и създайте ново при натискане на бутон от клавиатурата. Натиснатият бутон ще бъде прихванат преди да бъде изведен в текстовото поле.
 +
[[keypress]]
 
<code><pre>
 
<code><pre>
/*********************************************************************\
+
private void textBox1_TextChanged(object sender, EventArgs e)
* Title: Регионални настройки
+
    {
* Кодиране на символите (Encoding), Формат на дата, час, валута ...
+
        textBox1.Invoke(new EventHandler(delegate
* Author: ilianko
+
        {
*
+
            if (comport.IsOpen)
\*********************************************************************/
+
            {
 
+
              string t = textBox1.Text;
#include <stdio.h>
+
              char b = (char)t[t.Length - 1];
#include <locale.h>
+
              comport.Write(b.ToString());
 
+
              if (b == '\n')
int main()
+
                  comport.Write("\r".ToString());
 +
            }
 +
        }
 +
        ));
 +
    }
 +
</pre></code>
 +
<code><pre>
 +
private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
 
{
 
{
 
+
            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>
 
'''Задача 7.''' Разучете действието на програмата и преминете към следващата задача.
 
  
 
<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>
  
''' Задача. 8 ''' Преработете програмата по-горе да работи с wide characters.
+
== Връзки ==
 +
[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]
  
'' '''Упътване: '''Използвайте първите два примера, тип данни wchar_t, библиотеката <wchar.h> и функциите wcscmp(); wcscpy(); ''[[Решения|Решение]]
+
[http://www.cl.cam.ac.uk/~mgk25/unicode.html UTF-8 and Unicode FAQ]
  
== Литература ==
 
  
http://www.cl.cam.ac.uk/~mgk25/unicode.html
 
  
http://www.columbia.edu/kermit/utf8.html
 
  
[[Category:Компютърна периферия ]]
+
[[Category:Компютърна периферия| ]]

Revision as of 20:55, 25 March 2015

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

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