Kodowanie danych w komputerze
Wszystkie elementy, związane z komputerami (oprócz „maszynerii”, hardwaru) muszą być zapisane w pamięci komputerów. W szczególności: programy, dane wejściowe z klawiatury, liczby, obrazy, dźwięki, strony internetowe itp. Wszystkie muszą być przekształcone (przetłumaczone) na język wewnętrzny komputera, czyli w słowa binarne. Omówimy w skrócie metody tego zapisywania (czyli kodowania). Powiemy o kodowaniu: znaków (inaczej symboli), liczb, obrazów, dźwięków.
Informacje wstępne. 1. Dane w pamięci komputerów zapisywane są komórkach (cells) o pojemności 1 bajta, czyli 8 bitów.
Zatem ważny jest fakt zapisywania danych w 8-io bitowych porcjach (8=23).
2. Ponieważ trudno jest zapamiętywać długie słowa (liczby) binarne np.
10000101110, więc do skrócenia zapisów informatycy stosują zapis szesnastkowy
(hexadecimal notation). W tym zapisie każdą czwórkę bitów przekształcamy w jedną cyfrę systemu szesnastkowego: 0000 -> 0, 0001 ->1, …, 1000 ->8, 1001 -> 9, 1010 ->A,…,1111 ->F.
Zatem 10000101110 to 42E. Wiemy z matematyki konkretnej, że gdy słowo binarne jest liczbą w systemie dwójkowym, to wtedy jej przekształcenie daje tę samą liczbę w systemie szesnastkowym. Na przykład (10000101110)2 = (42E)16. Aby odróżnić zapis szesnastkowy informatycy zapisują na początku (prefix) 2 symbole 0x, np. 42E to 0x42E.
Kodowanie znaków
Ze względu na olbrzymią liczbę znaków (symboli) w różnych językach, w matematyce i innych dziedzinach nauki, różnych znaków specjalnych, różnych interpretacji znaków, pojawiła się konieczność ujednolicenia (standaryzacji) znaków i symboli.
Przykład. 1. Na świecie jest około 6000 języków i to wiele ze swoimi alfabetami.
2. W USA kropka „.” oddziela część całkowitą od ułamkowej w liczbie dzisiętnej np. 23.14, a u nas przecinek „,”, czyli 23,14.
3. Duża litera „A” oznacza literę A w alfabetach: łacińskim i w greckim. Ale gdyby komputer miał zamienić tę literę na małą to nie wiedziałby o który alfabet chodzi. W każdym z nich mała litera pisze się inaczej (inny znak): a, α.
4. W pewnych językach ta sama litera w zależności od jej miejsca w słowie pisze się inaczej.
Pierwszym, ogólnie stosowanym kodowaniem był (i jest nadal) kod ASCI (American Standard Code for Information Interchange). Został wprowadzony w 1963 roku przez American National Standards Institute (ANSI). Za podstawę przyjęto 8-io bitowe (1 bajt)
kodowanie podstawowych znaków i symboli. Ponieważ wtedy 1 bit (ostatni) z tej ósemki bitów przeznaczono na kontrolę parzystości (bit parzystości)
więc można było zakodować tylko 27=128 symboli i znaków. Ponieważ był to amerykański standard więc zakodowano tylko litery łacińskie: A,B,..,a,b,.., znaki specjalne np. @ i pewne znaki kontrolne
Przykład. W kodzie ASCII:
A -> 0x41 (czyli (65)10 = (01000001)2), a -> 0x61, @ -> 0x40 (w tych kodach dodane jest 0 na początku)
W miarę rozwoju techniki cyfrowej (np. niezawodności przekazywania, transmitowania danych) bit kontrolny stracił na znaczeniu i wtedy przy 8-io bitowym kodowaniu pojawiło się kolejne 128 możliwości (z jedynką na początku). Wykorzystano je na zakodowanie nowych znaków i symboli. Ale zamiast dodać 128 nowych znaków i symboli dodano wiele „tablic”
znaków i symboli (z różnych języków, symbole matematyczne, wiele nowych znaków specjalnych itp.). Proces ten przeprowadziła międzynarodowa organizacja – International Organization for Standarization (w skrócie ISO). Te nowe tablice to:
1. ISO-8859-1 (Nazwa Latin 1) – specjalne znaki, litery języków zachodnich np. ê, ä itd.
2. ISO-8859-2 (Nazwa Latin 2) – specjalne znaki, litery języków wschodnich np. ą, Ł, б itd.
3. …aż do 17 tablicy
Jednak to nie uratowało sytuacji:
1. wszystkich znaków i symboli na świecie jest znacznie więcej,
2. kłopot powstaje z tekstami w których użyte są różne tablice znaków.
Powstało Unicode Consortium (stowarzyszenie największych firm i instytucji informatycznych na początku lat dziewięćdziesiątych), które postanowiło uporządkować generalnie sprawę z kodowaniem. Wypracowało (i nadal to robi) ogólne metody, filozofię kodowania znaków i symboli oraz opracowało jednolite kodowanie. Przyjęto za podstawę (choć rozszerzono to na więcej bitów) kodowania 16 bitów (w ASCII było to 8 bitów). Oznaczało to
216 =65 536
możliwości. Nie wszystkie zostały już wykorzystane. Powstają kolejne wersje (obecnie to Unicode 13).
Główne cechy kodowania Unicode:
1. Jednoznaczność – każdemu znakowi (symbolowi) w sensie znaczenia (czyli semantycznym) odpowiada jeden unikalny numer (kod).
2. Uniwersalność – Unicode zawiera prawie wszystkie znaki, symbole, litery prawie wszystkich języków świata i wiele innych specjalnych znaków.
3. Efektywność – nie ma potrzeby tworzenia dużej liczby konwerterów z jednego kodowania do innego (na świecie jest bardzo dużo różnych kodowań).
4. Kodowanie reprezentuje tzw. czysty tekst tzn. tzn. w kodzie danego znaku nie ma informacji o wyglądzie tego znaku (a, a, a,…), strukturze dokumentu itp.
5. Kodowanie to uwzględnia (zachowuje) logiczny porządek tzn. kolejność znaków w kodzie odpowiada kolejności pisania tych znaków (np. w języku arabskim piszemy od prawej do lewej strony).
6. Zachowuje zgodność z ASCII w zakresie podstawowych 128 znaków (za chwilę to wyjaśnimy).
Jednak w komputerach nie używa się numerów kodowania Unicode (16-bitowych), lecz bardziej ekonomicznego, efektywnego zapisu (aby często używane znaki miały krótki kod binarny w komputerach). Mianowicie, każdy znak w Unicode ma 16 bitowy numer. Dla skrótu zapisuje się je w notacji szesnastkowej, a więc każdy znak w Unicode ma 4 cyfrowy zapis szesnastkowy. Na przykład
A łacińskie to U+0041 A w cyrylicy to U+0410
A greckie to U+0391
= to U+003D ä to U+00E4
(w Microsoft Word kliknięcie Wstawianie /Symbol wyświetla okno w którym możemy odczytać te kody).
W komputerach na ogół stosuje się zapis UTF-8 (Uniform Transformation Format) który przekształca numer binarny znaku w Unicode na 1 bajt (zwany również oktetem = 8 bitów) lub na 2 oktety lub na 3 oktety lub 4 oktety (ta ostatnia możliwość dla 21 bitowego kodowania Unicode). Algorytm transformacji numeru znaku w Unicode na UTF-8 jest następujący:
Kod binarny 16 - bitowy znaku
1 oktet 2 oktet 3 oktet
00000000 0xxxxxxx 0xxxxxxx
00000yyy yyxxxxxx 110yyyyy 10xxxxxx
zzzzyyyy yyxxxxxx 1110zzzz 10yyyyyy 10xxxxxx
Przykład. (prefix U+ oznacza Unicode)
A -> U+0041 0000 0000 0100 0001 -> 01000001 - jeden oktet
ä -> U+00E4 -> 0000 0000 1110 0010 -> 11000011 10100010 – dwa oktety
Ważną zaletą UTF-8 jest że dla pierwszych 128 znaków (a więc z ASCII najbardziej popularnych) kodowania w starym ASCII i w UTF-8 są takie same. Istnieją również inne sposoby zapisu UTF-16, UTF-32 i inne.