Difference between revisions of "Клавиатура, Utf-8"
m (moved Упражнение 5. Клавиатура, Utf-8 to Клавиатура, Utf-8) |
|||
(35 intermediate revisions by the same user not shown) | |||
Line 1: | Line 1: | ||
− | == | + | == Клавиатурна подредба (keyboard layout) == |
− | + | https://2cyr.com | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | [[Image:QWERT.png|thumb|400px|right|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). | |
+ | [[Image:utf.png|left|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 | |
− | + | *бързо движение между символите (напред назад) | |
− | |||
− | |||
<table style="font-style:Courier"> | <table style="font-style:Courier"> | ||
− | <tr><td>U-00000000 – U-0000007F:</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 57: | ||
'''Задача 3. Да се създадат общо 6 html страници със следното съдържание: | '''Задача 3. Да се създадат общо 6 html страници със следното съдържание: | ||
<code><pre> | <code><pre> | ||
+ | <!DOCTYPE html> | ||
<html> | <html> | ||
<head> | <head> | ||
Line 67: | Line 64: | ||
<body> | <body> | ||
Текст на кирилица | Текст на кирилица | ||
+ | Text in Latin | ||
</body> | </body> | ||
</html> | </html> | ||
</pre></code> | </pre></code> | ||
− | + | Като текста се запише с кодиране utf-8 и windows-1251 и * се замести с: | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | + | #празно поле | |
− | <meta | + | #<code><pre><meta charset="UTF-8" /></pre></code> |
− | </pre></code> | + | #<code><pre><meta charset=windows-1251 /></pre></code> |
− | |||
− | Разгледайте създадените файлове с | + | Разгледайте създадените файлове с web браузър. Настройте браузъра правилно да възпроизвежда файловете с неправилно задаване на енкодинга. |
== Набор от символи и колация (сравняване) == | == Набор от символи и колация (сравняване) == | ||
Line 89: | 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 | '''Задача 4'''. Да се разгледат настройките на колацията в MySQL | ||
Line 95: | Line 86: | ||
== Други настройки. == | == Други настройки. == | ||
AT – клавиатурите имат програмируеми настройки на повторенията при задържане и време на закъснение при задръжка. Времето на задръжка е от 0,25 до 1 секунда. Брой повторения при натиснат бутон е от 2 до 30 за секунда. | AT – клавиатурите имат програмируеми настройки на повторенията при задържане и време на закъснение при задръжка. Времето на задръжка е от 0,25 до 1 секунда. Брой повторения при натиснат бутон е от 2 до 30 за секунда. | ||
− | |||
== Данни от клавиатурата == | == Данни от клавиатурата == | ||
Line 130: | Line 120: | ||
</pre></code> | </pre></code> | ||
− | == | + | == Keypress handler== |
− | |||
− | + | Редактирайте програмата за серийна комуникация да използва [https://msdn.microsoft.com/en-us/library/system.windows.forms.keypresseventargs%28v=vs.100%29.aspx KeyPressEventArgs Class]. | |
− | |||
− | |||
− | |||
− | |||
+ | Изтрийте събитието на textBox при промяна на текста и създайте ново при натискане на бутон от клавиатурата. Натиснатият бутон ще бъде прихванат преди да бъде изведен в текстовото поле. | ||
+ | [[keypress]] | ||
<code><pre> | <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> | ||
+ | private void textBox1_KeyPress(object sender, KeyPressEventArgs e) | ||
{ | { | ||
− | + | e.Handled = true; | |
− | + | if (comport.IsOpen) | |
− | + | { | |
− | + | comport.Write(e.KeyChar.ToString()); | |
− | + | textBox2.Text += e.KeyChar.ToString(); | |
− | + | } | |
− | |||
− | |||
− | |||
− | |||
} | } | ||
</pre></code> | </pre></code> | ||
− | |||
− | |||
<code><pre> | <code><pre> | ||
− | + | 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; | ||
+ | } | ||
+ | |||
+ | } | ||
} | } | ||
</pre></code> | </pre></code> | ||
− | + | == Връзки == | |
+ | [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] | |
− | |||
− | |||
− | |||
− | [[Category:Компютърна периферия ]] | + | [[Category:Компютърна периферия| ]] |
Latest revision as of 08:40, 27 April 2024
Contents
Клавиатурна подредба (keyboard layout)
Клавиатурна подредба (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).
С цел премахване на неудобството от големия брой кодови таблици е разработен стандартът 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 и * се замести с:
- празно поле
<meta charset="UTF-8" />
<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