ASCII

ASCII (czyt. aski, skrót od ang. American Standard Code for Information Interchange) – siedmiobitowy system kodowania znaków, używany we współczesnych komputerach oraz sieciach komputerowych, a także innych urządzeniach wyposażonych w mikroprocesor. Przyporządkowuje liczbom z zakresu 0−127: litery alfabetu łacińskiego języka angielskiego, cyfry, znaki przestankowe i inne symbole oraz polecenia sterujące. Na przykład litera „a” jest kodowana jako liczba 97, a znak spacji jest kodowany jako 32. Większość współczesnych systemów kodowania znaków jest rozszerzeniem standardu ASCII.

ASCII jest tradycyjną nazwą tego zestawu znaków, jednak IANA zaleca używanie określenia US-ASCII, które podkreśla pochodzenie standardu, oraz to, pod kątem jakich znaków był projektowany (ASCII nie zawiera na przykład liter diakrytyzowanych, powszechnych w alfabetach europejskich).

ASCII znajduje się na liście kamieni milowych IEEE.

Przegląd 
Standard ASCII został stworzony na podstawie kodu telegraficznego. Prace nad nim rozpoczęły się 6 października 1960 roku, podczas pierwszego spotkania grupy X3.2 American National Standards Institute (ANSI). Trzy lata później, w 1963 roku, została udostępniona pierwsza wersja standardu ASCII. W porównaniu do wcześniejszych systemów kodowania znaków, ten zestaw znaków był wygodny w użyciu do sortowania alfabetycznego tekstów, zmiany wielkości znaków, a także wspierał urządzenia inne niż dalekopisy. Od czasu wprowadzenia na rynek, ASCII został czterokrotnie zaktualizowany – w 1967, 1968, 1977 i 1986 roku.

Każdy znak w kodzie ASCII jest przedstawiany jako 7-bitowa liczba całkowita. 95 spośród nich stanowią znaki drukowalne: małe i wielkie litery alfabetu łacińskiego, cyfry, znaki przestankowe oraz inne symbole. Standard ten został stworzony do obsługi języka angielskiego, dlatego pośród liter, które znajdują się w tabeli, nie ma żadnych diakrytyzowanych. Większość znaków sterujących jest dzisiaj przestarzała – zostały one pomyślane głównie dla dalekopisów.

Standard ASCII był najpopularniejszym zestawem znaków używanym w internecie do grudnia 2007, kiedy to został zastąpiony przez UTF-8. Kodowanie UTF-8 jest wstecznie kompatybilne z ASCII.

Historia 
Kod ASCII został opublikowany jako standard ASA X3.4-1963. Zestaw znaków w niewielkim stopniu różnił się od obecnego. Nieprzypisana była 1 sekwencja sterująca oraz 28 pozycji zarezerwowanych do późniejszego wykorzystania. W grupie roboczej toczyła się dyskusja, czy należy do kodu wprowadzić małe litery, czy też więcej znaków sterujących. W maju 1963 zadecydowano, by tzw. patyki szósty i siódmy wypełnić małymi literami alfabetu łacińskiego. Spowodowało to, że między wielką a małą literą jest tylko jeden bit różnicy (np. literze „A” jest przyporządkowany kod 65 (100001), a „a” – 97 (100001)), co ułatwiało konstruowanie klawiatur oraz porównywanie tekstów nieuwzględniające wielkości liter. Ta zmiana weszła do standardu ASCII dopiero w 1967 roku.

Do standardu ASCII z 1963 roku zostały wprowadzone jeszcze następujące zmiany:
 wprowadzenie znaków takich jak nawiasy klamrowe oraz kreska pionowa,
 zmiana nazwy niektórych kodów kontrolnych (np. SOM zmieniono na SOH),
 przeniesienie lub usunięcie niektórych znaków kontrolnych (np. usunięto RU).
Standard ASCII był uaktualniany czterokrotnie – w latach 1967, 1968, 1977 i 1986. Przygotowany został także piąty standard – z 1965 roku, ale nie został opublikowany (mimo wszystko był używany przez niektóre maszyny IBM).

Założenia przyjęte podczas projektowania

Liczba bitów 
Grupa X3.2 projektowała ASCII na podstawie dawniejszych zestawów znaków, przeznaczonych dla dalekopisów. Zawierały one 26 liter, 10 cyfr oraz od 11 do 25 symboli. Aby uwzględnić je wszystkie oraz znaki kontrolne zgodne ze standardami CCITT ITA2 (1924), FIELDATA (1956–57) oraz wczesnym EBCDIC (1963), potrzeba było więcej niż 64 znaki. Można by je zmieścić na 6 bitach używając dwóch zestawów znaków i specjalnych kodów SHIFT zmieniających używany zestaw (jak np. w ITA2). Jednak wiadomości zakodowane w ten sposób łatwo mogły ulec zniekształceniu, ponieważ przekłamanie podczas transmisji kodu SHIFT mogłoby zmienić brzmienie dużej części tekstu. Grupa odpowiedzialna za sformułowanie standardu ASCII sprzeciwiała się temu, dlatego kod musiał używać co najmniej 7 bitów na jeden znak.

Rozważano także wykorzystanie ośmiu bitów, co pozwoliłoby na zastosowanie większego zestawu znaków, jednak zadecydowano, że ASCII będzie siedmiobitowy, ponieważ każdy dodatkowy bit zwiększyłby długość wiadomości, a co za tym idzie – również koszt jej przesłania. Ówczesne karty dziurkowane mogły przechować na jednej pozycji osiem bitów, co można było wykorzystać do przechowywania bitu parzystości. Urządzenia niestosujące kontroli błędów przechowywały tam 0. Niektóre drukarki korzystały z ósmego bitu, by obsługiwać kursywę.

Podział na grupy znaków 
Kod ASCII został podzielony na dwie grupy – dwa patyki (zerowy i pierwszy) przeznaczone na znaki sterujące oraz sześć patyków (od drugiego do siódmego) zawierających znaki drukowalne (wyjątkiem jest znak 127: DEL). Znak spacji został umieszczony pod adresem 0x20, czyli przed wszystkimi innymi literami, aby ułatwić sortowanie. Z tego samego względu, wiele symboli używanych jako separatory znajduje się przed literami i cyframi – na patyku drugim. Grupa robocza zadecydowała, że wydzielenie sensownego 64-znakowego (sześciobitowego) alfabetu z ASCII ma być łatwe i taki alfabet powinien być jednym ciągłym blokiem. Z tego powodu małe litery nie są przeplecione z wielkimi. Wielka litera A została umieszczona na pozycji 0x41, w celu zgodności z brytyjską propozycją standardu kodowania znaków. Cyfry 0–9 składają się z bitów 011 oraz, następującej po nich, binarnej reprezentacji liczb odpowiadających każdej z cyfr. Ułatwia to konwersję liczb na system binary-coded decimal.

Pozycja większości znaków niealfanumerycznych jest związana z ich umiejscowieniem na klawiaturach mechanicznych maszyn do pisania. Standardowy układ klawiszy pochodzi z maszyny Remington No. 2 z 1878 roku, pierwszej z klawiszem Shift. Klawiszom 23456789- odpowiadały, kolejno, znaki "#$%_&'(). Początkowo, na klawiaturach maszyn do pisania nie używano cyfr 0 i 1, ponieważ mogły one być zastąpione przez O (wielkie o) oraz l (małe L). Pary 1! oraz 0) stały się popularne, gdy klawisze z tymi cyframi weszły do użycia. Znaki !"#$% zostały umieszczone na drugim patyku, obok odpowiadających im cyfr. Ze względu na to, że zero znajduje się w tabeli kodu ASCII obok spacji i nie można tam wstawić nawiasu zamykającego, znak podkreślenia został usunięty (wstawiono go w 1967 roku za wielkimi literami), a za procentem znajdują się znaki odpowiadające kolejnym cyfrom (tj. &'()). Taki układ był często spotykany na europejskich maszynach do pisania. Para znaków /? pochodzi również z maszyny No. 2, natomiast ,< .> były używane tylko na części klawiatur. Na pozostałych kropkę i przecinek można było wpisać zarówno z naciśniętym klawiszem Shift, jak i bez niego. Standard ASCII rozbił znaki ;:, spotykane dotąd na jednym klawiszu, oraz zmienił układ symboli matematycznych (zamiast najczęstszego wariantu -* =+ było :* ;+ -=).

Niektóre, popularne w USA znaki, takie jak ½¼¢, nie zostały uwzględnione, podczas gdy wprowadzono: diakrytyki ^`~ do użytku międzynarodowego oraz znaki <>\|. Symbol @ nie był powszechny w Europie, dlatego grupa X3.2 spodziewała się umieszczenia w jego miejscu litery À we francuskiej odmianie standardu. Z tego względu małpa została umieszczona na pozycji 0x40, czyli tuż przed wielkim A.

Najważniejszymi kodami sterującymi były: Start of message (SOM), End of address (EOA), End of message (EOM), End of transmission (EOT), Who are you? (WRU), Are you? (RU), Reserved device control (DC0), Synchronous idle (SYNC) i Acknowledge (ACK). Zostały one rozmieszczone w ten sposób, by odległość Hamminga między nimi była jak największa.

Podział

Znaki sterujące 

Standard ASCII przeznacza pierwsze 32 kody (0–31) na znaki sterujące. Nie są one przeznaczone do przenoszenia drukowalnych symboli, lecz do sterowania urządzeniem odbierającym dane. Na przykład, znak 10 (LF) oznaczający przejście do nowej linii, powoduje przesunięcie papieru w drukarce, a znak 8, czyli Backspace powodował cofnięcie karetki o jedno pole. ASCII nie definiuje żadnego mechanizmu pozwalającego na formatowanie tekstu w obrębie jednej linii.

Znaki drukowalne 
Kody 0x20 – 0x7E reprezentują litery, cyfry oraz inne, możliwe do wyświetlenia na ekranie, symbole. Standard ASCII definiuje łącznie (wliczając spację) 95 znaków drukowalnych:  !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~

Wcześniejsze wersje ASCII zawierały strzałkę do góry zamiast karety oraz strzałkę w lewo zamiast znaku podkreślenia.

Rozszerzenia 
Ponieważ kod ASCII jest 7-bitowy, a większość komputerów operuje na 8-bitowych bajtach, dodatkowy bit można wykorzystać na powiększenie zbioru kodowanych znaków do 256 symboli. Powstało wiele różnych rozszerzeń ASCII, ponad 220 stron kodowych DOS i Windows, wykorzystujących ósmy bit (np. norma ISO 8859, rozszerzenia firm IBM lub Microsoft) nazywanych stronami kodowymi. Również kodowanie UTF-8 można uważać za rozszerzenie ASCII, tutaj jednak dodatkowe znaki są kodowane na 2 i więcej bajtach. Formalnie, mianem rozszerzeń ASCII można nazwać jedynie te standardy, które zachowują układ pierwszych 128 znaków i dodają nowe na końcu tabeli.

Zestawy 7-bitowe 

ASCII było od początku projektowane jako jedna z wielu narodowych wersji międzynarodowego zestawu znaków. W Europie popularny był standard ISO 646, oparty na ASCII, który rezerwował określone pozycje (odpowiadające m.in. znakom: {}[]|\^~#$) dla liter używanych w narodowych językach oraz dla lokalnego symbolu waluty.

Ze względu na to, że niektóre symbole zamieniono w ISO 646 na litery, programista w Europie musiał wybrać, czy chce na swoim komputerze korzystać z lokalnych liter, czy też z pierwotnie przypisanych znaków. Wybranie pierwszego powodowało, że kod stawał się mniej czytelny – zamiast { a[i] = '\n'; } w polskiej odmianie standardu wyświetlone zostałoby ł aźiń = '\n'; ć.

Zestawy 8-bitowe 

Wraz z rozwojem komputerów oraz spadkiem kosztów transmisji danych, zaczęły się pojawiać 8-bitowe zestawy znaków. Pojawiły się standardy z rodziny ISO 8859 oraz Windows-1250, które zapewniały obsługę liter narodowych używając do tego zakresu 128–255, jednocześnie pozostawiając nietknięty obszar wspólny z ASCII. Alfabet polski był wspierany przez kodowanie ISO 8859-2 oraz Windows-1250.

Unicode 

Unicode oraz Universal Character Set (UCS, ISO 10646) obsługują znacznie większą liczbę znaków, dzięki czemu wszystkie alfabety używane na świecie mogą zostać umieszczone w jednym kodowaniu. Są one wstecznie kompatybilne z ASCII (tekst składający się wyłącznie ze znaków 0–127 ma taką samą reprezentację w obu standardach).

Tabela kodów ASCII

Zobacz też 
 Ascii85
 ASCII-Art
 Basic Latin (blok Unicode)
 Extended ASCII

Przypisy

Uwagi

Bibliografia

Linki zewnętrzne 
 
 

Formaty plików komputerowych
Kodowania znaków