ASCII
ASCII (czyt. aski, skrót od ang. American Standard Code for Information Interchange) to siedmiobitowy system kodowania znaków, który jest wykorzystywany w nowoczesnych komputerach, sieciach komputerowych oraz różnych urządzeniach z mikroprocesorami. Przyporządkowuje on liczbom z przedziału 0−127 takie znaki jak litery alfabetu łacińskiego języka angielskiego, cyfry, znaki przestankowe oraz inne symbole i polecenia sterujące. Na przykład, litera „a” ma przyporządkowany kod 97, a znak spacji kod 32. Większość aktualnych systemów kodowania znaków jest rozwinięciem standardu ASCII.
Mimo że ASCII jest tradycyjną nazwą tego zestawu znaków, IANA zaleca używanie terminu US-ASCII, który podkreśla jego pochodzenie oraz kontekst, w jakim został zaprojektowany (na przykład ASCII nie obsługuje liter diakrytyzowanych, popularnych w europejskich alfabetach).
ASCII znajduje się na liście kamieni milowych IEEE.
Przegląd
Standard ASCII został opracowany 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). W 1963 roku udostępniono pierwszą wersję standardu. W porównaniu do wcześniejszych systemów kodowania, zestaw ten był wygodny do sortowania alfabetycznego, zmiany wielkości liter oraz obsługi innych urządzeń niż dalekopisy. Od momentu wprowadzenia na rynek, standard ASCII przeszedł cztery aktualizacje: w 1967, 1968, 1977 i 1986 roku.
Każdy znak w ASCII jest reprezentowany jako 7-bitowa liczba całkowita. Z 95 znaków, które są drukowalne, składają się na nie małe i wielkie litery alfabetu łacińskiego, cyfry, znaki przestankowe oraz inne symbole. Standard został opracowany do obsługi języka angielskiego, więc w tabeli nie znajdziemy liter z diakrytyką. Większość znaków sterujących jest obecnie przestarzała, gdyż były one zaprojektowane głównie dla dalekopisów.
Standard ASCII był najpopularniejszym zestawem znaków w Internecie do grudnia 2007 roku, kiedy to został zastąpiony przez UTF-8, które jest wstecznie kompatybilne z ASCII.
Historia
Kod ASCII został opublikowany jako standard ASA X3.4-1963. Zestaw znaków w tamtym czasie nieznacznie różnił się od obecnego; jedna sekwencja sterująca oraz 28 pozycji były zarezerwowane do późniejszego wykorzystania. W grupie roboczej dyskutowano, czy do kodu wprowadzić małe litery czy więcej znaków sterujących. W maju 1963 roku podjęto decyzję, aby wypełnić tzw. patyki szósty i siódmy małymi literami alfabetu łacińskiego. Dzięki temu między wielką a małą literą jest tylko jeden bit różnicy (np. litera „A” ma kod 65 (1000001), a „a” – 97 (1100001)), co ułatwia tworzenie klawiatur oraz porównywanie tekstów bez uwzględnienia wielkości liter. Ta zmiana została wprowadzona do standardu ASCII w 1967 roku.
Do standardu ASCII z 1963 roku wprowadzono następujące zmiany:
- wprowadzenie znaków takich jak nawiasy klamrowe oraz kreska pionowa,
- zmiana nazw 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ł aktualizowany czterokrotnie – w latach 1967, 1968, 1977 i 1986. Przygotowano także piąty standard z 1965 roku, lecz nie został on opublikowany (mimo to był stosowany przez niektóre maszyny IBM).
Założenia przyjęte podczas projektowania
Liczba bitów
Grupa X3.2 projektowała ASCII na podstawie starszych zestawów znaków przeznaczonych dla dalekopisów, które zawierały 26 liter, 10 cyfr oraz od 11 do 25 symboli. Aby uwzględnić wszystkie te znaki oraz znaki kontrolne zgodne z normami CCITT ITA2 (1924), FIELDATA (1956–57) oraz wczesnym EBCDIC (1963), potrzebnych było więcej niż 64 znaki. Można by je zmieścić na 6 bitach, stosując dwa zestawy znaków oraz specjalne kody SHIFT do ich zmiany (jak w ITA2). Niemniej jednak, wiadomości zakodowane w ten sposób mogłyby łatwo ulec zniekształceniu, ponieważ błąd w transmisji kodu SHIFT mógłby wpłynąć na dużą część 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 ostatecznie zdecydowano, że ASCII będzie siedmiobitowy, ponieważ każdy dodatkowy bit zwiększyłby długość wiadomości, a co za tym idzie – także koszt jej przesłania. W tamtych czasach karty dziurkowane mogły przechować osiem bitów na jednej pozycji, co można było wykorzystać do przechowywania bitu parzystości. Urządzenia niekorzystające z kontroli błędów przechowywały tam 0. Niektóre drukarki wykorzystywały ósmy bit do obsługi kursywy.
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ątek stanowi znak 127: DEL). Znak spacji został umieszczony na adresie 0x20, co umożliwia łatwiejsze sortowanie. Z tego samego powodu wiele symboli używanych jako separatory znajduje się przed literami i cyframi – na patyku drugim. Grupa robocza zdecydowała, że wydzielenie sensownego 64-znakowego (sześciobitowego) alfabetu z ASCII ma być proste i taki alfabet powinien być jednym ciągłym blokiem. Dlatego małe litery nie są wymieszane z wielkimi. Wielka litera A znajduje się na pozycji 0x41, aby zachować zgodność z brytyjską propozycją standardu kodowania znaków. Cyfry 0–9 składają się z bitów 011 oraz binarnej reprezentacji liczb odpowiadających każdej z cyfr, co ułatwia konwersję liczb na system binary-coded decimal.
Pozycje większości znaków niealfanumerycznych są związane 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 być one zastąpione przez O (wielkie o) oraz l (małe L). Pary 1! oraz 0) stały się popularne, gdy klawisze z tymi cyframi zaczęły być używane. Znaki !”#$% zostały umieszczone na drugim patyku, obok odpowiadających im cyfr. Ponieważ zero znajduje się w tabeli kodu ASCII obok spacji i nie można tam umieścić nawiasu zamykającego, znak podkreślenia został usunięty (wstawiony 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, podczas gdy ,< .> były używane tylko na niektórych klawiaturach. Na pozostałych klawisze kropka i przecinek można było wpisać zarówno z wciśniętym klawiszem ⇧ Shift, jak i bez niego. Standard ASCII rozdzielił znaki ;:, które wcześniej znajdowały się na jednym klawiszu, oraz zmienił układ symboli matematycznych (zamiast najczęstszego wariantu -* =+ było :* ;+ -=).
Niektóre znaki, popularne w USA, takie jak ½¼¢, nie znalazły się w standardzie, podczas gdy wprowadzono diakrytyki ^`~ do użytku międzynarodowego oraz znaki <>\|. Symbol @ nie był powszechny w Europie, więc grupa X3.2 spodziewała się umieszczenia w jego miejscu litery À we francuskiej wersji standardu. Dlatego małpa została umieszczona na pozycji 0x40, tuż przed wielką 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) oraz Acknowledge (ACK). Zostały one rozmieszczone w sposób, który maksymalizował odległość Hamminga między nimi.
Podział
Znaki sterujące
Standard ASCII rezerwuje pierwsze 32 kody (0–31) na znaki sterujące. Nie są one przeznaczone do przesyłania drukowalnych symboli, lecz do kontrolowania urządzenia odbierającego 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, cofa karetki o jedno pole. ASCII nie definiuje żadnego mechanizmu umożliwiającego formatowanie tekstu w obrębie jednej linii.
Znaki drukowalne
Kody 0x20 – 0x7E reprezentują litery, cyfry oraz inne symbole, które można wyświetlić na ekranie. Standard ASCII definiuje łącznie (wliczając spację) 95 znaków drukowalnych: !”#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~
Wcześniejsze wersje ASCII zawierały strzałkę w górę zamiast karety oraz strzałkę w lewo zamiast znaku podkreślenia.
Rozszerzenia
Ze względu na to, że kod ASCII jest siedmiobitowy, a większość komputerów operuje na 8-bitowych bajtach, dodatkowy bit można wykorzystać do zwiększenia zbioru kodowanych znaków do 256 symboli. Powstało wiele różnych rozszerzeń ASCII, ponad 220 stron kodowych DOS i Windows, które wykorzystują ósmy bit (np. norma ISO 8859, rozszerzenia firm IBM i Microsoft) nazywane stronami kodowymi. Także kodowanie UTF-8 można uznać za rozszerzenie ASCII, gdzie 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
Od samego początku ASCII projektowano jako jedną 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 lokalnych symboli walut.
W związku z tym, że niektóre symbole zostały zamienione w ISO 646 na litery, programista w Europie musiał zdecydować, czy chce korzystać z lokalnych liter, czy też z pierwotnie przypisanych znaków. Wybierając pierwszą opcję, kod stawał się mniej czytelny – zamiast { a[i] = '\n’; } w polskiej wersji standardu wyświetlone zostałoby ł aźiń = '\n’; ć.
Zestawy 8-bitowe
Wraz z rozwojem komputerów oraz spadkiem kosztów transmisji danych, zaczęły pojawiać się 8-bitowe zestawy znaków. Pojawiły się standardy z rodziny ISO 8859 oraz Windows-125x, które zapewniały obsługę liter narodowych, używając do tego zakresu 128–255, pozostawiając jednocześnie 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 całym świecie mogą być 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ż
Przypisy
Uwagi
Bibliografia
Charles E. Mackenzie: Coded Character Sets, History and Development. Addison-Wesley Publishing Company, Inc., 1980, s. 66, 215, 217, 220, 228, 236–238, 243–245, 247–248, 435, seria: The Systems Programming Series. ISBN 0-201-14460-3. LCCN 77-90165. [dostęp 2018-07-15]. (ang.).
Linki zewnętrzne
On the Early Development of ASCII – The History of ASCII. [zarchiwizowane z tego adresu]. (ang.).