ASCII

7-bitowy system kodowania wybranych znaków i poleceń sterujących

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.

94 znaki drukowalne możliwe do zapisania w kodzie ASCII
Tabela kodu ASCII z instrukcji obsługi drukarki pochodzącej sprzed 1972 roku (b1 oznacza najmniej znaczący bit)

ASCII jest tradycyjną nazwą tego zestawu znaków, jednak IANA zaleca używanie określenia US-ASCII[1], 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 edytuj

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[2][3][4][5], 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[5][6][7], 1968[5][8], 1977[5] i 1986[5][9] roku.

Każdy znak w kodzie ASCII jest przedstawiany jako 7-bitowa liczba całkowita[10]. 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[11].

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[12][13][14].

Historia edytuj

Kod ASCII został opublikowany jako standard ASA X3.4-1963[3][15]. 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[16]. W grupie roboczej toczyła się dyskusja, czy należy do kodu wprowadzić małe litery, czy też więcej znaków sterujących[17]. W maju 1963 zadecydowano, by tzw. patyki[a][18] szósty i siódmy[19] 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 (1000001), a „a” – 97 (1100001)), 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[20],
  • 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)[21].

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)[4][5][8].

Założenia przyjęte podczas projektowania edytuj

Liczba bitów edytuj

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)[22][23], 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[24].

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[25]. Urządzenia niestosujące kontroli błędów przechowywały tam 0[26]. Niektóre drukarki korzystały z ósmego bitu, by obsługiwać kursywę.

Podział na grupy znaków edytuj

Kod ASCII został podzielony na dwie grupy – dwa patyki (zerowy i pierwszy)[18] przeznaczone na znaki sterujące[27] 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[28], 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[29]. 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[30]. 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[31]. 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[18]. 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[32].

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[33].

Podział edytuj

Znaki sterujące edytuj

Osobny artykuł: Kod sterujący.

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 edytuj

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[3][34].

Rozszerzenia edytuj

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[35]. 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 edytuj

Osobny artykuł: ISO/IEC 646.

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'; ć[36].

Zestawy 8-bitowe edytuj

Osobne artykuły: ISO 8859-2, CP852Windows-1250.

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-125x, 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 edytuj

Osobne artykuły: Unikod, ISO 10646, UTF-8UTF-7.

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)[37].

Tabela kodów ASCII edytuj

Bin Dec Hex Znak Skrót
0000 0000 0 00 Null NUL
0000 0001 1 01 Start of Heading SOH
0000 0010 2 02 Start of Text STX
0000 0011 3 03 End of Text ETX
0000 0100 4 04 End of Transmission EOT
0000 0101 5 05 Enquiry ENQ
0000 0110 6 06 Acknowledge ACK
0000 0111 7 07 Bell BEL
0000 1000 8 08 Backspace BS
0000 1001 9 09 Horizontal Tab HT
0000 1010 10 0A Line Feed LF
0000 1011 11 0B Vertical Tab VT
0000 1100 12 0C Form Feed FF
0000 1101 13 0D Carriage Return CR
0000 1110 14 0E Shift Out SO
0000 1111 15 0F Shift In SI
0001 0000 16 10 Data Link Escape DLE
0001 0001 17 11 Device Control 1 (XON) DC1
0001 0010 18 12 Device Control 2 DC2
0001 0011 19 13 Device Control 3 (XOFF) DC3
0001 0100 20 14 Device Control 4 DC4
0001 0101 21 15 Negative Acknowledge NAK
0001 0110 22 16 Synchronous Idle SYN
0001 0111 23 17 End of Transmission Block ETB
0001 1000 24 18 Cancel CAN
0001 1001 25 19 End of Medium EM
0001 1010 26 1A Substitute SUB
0001 1011 27 1B Escape ESC
0001 1100 28 1C File Separator FS
0001 1101 29 1D Group Separator GS
0001 1110 30 1E Record Separator RS
0001 1111 31 1F Unit Separator US
   
Bin Dec Hex Znak
0010 0000 32 20 Spacja
0010 0001 33 21 !
0010 0010 34 22 "
0010 0011 35 23 #
0010 0100 36 24 $
0010 0101 37 25 %
0010 0110 38 26 &
0010 0111 39 27 '
0010 1000 40 28 (
0010 1001 41 29 )
0010 1010 42 2A *
0010 1011 43 2B +
0010 1100 44 2C ,
0010 1101 45 2D -
0010 1110 46 2E .
0010 1111 47 2F /
0011 0000 48 30 0
0011 0001 49 31 1
0011 0010 50 32 2
0011 0011 51 33 3
0011 0100 52 34 4
0011 0101 53 35 5
0011 0110 54 36 6
0011 0111 55 37 7
0011 1000 56 38 8
0011 1001 57 39 9
0011 1010 58 3A :
0011 1011 59 3B ;
0011 1100 60 3C <
0011 1101 61 3D =
0011 1110 62 3E >
0011 1111 63 3F ?
   
Bin Dec Hex Znak
0100 0000 64 40 @
0100 0001 65 41 A
0100 0010 66 42 B
0100 0011 67 43 C
0100 0100 68 44 D
0100 0101 69 45 E
0100 0110 70 46 F
0100 0111 71 47 G
0100 1000 72 48 H
0100 1001 73 49 I
0100 1010 74 4A J
0100 1011 75 4B K
0100 1100 76 4C L
0100 1101 77 4D M
0100 1110 78 4E N
0100 1111 79 4F O
0101 0000 80 50 P
0101 0001 81 51 Q
0101 0010 82 52 R
0101 0011 83 53 S
0101 0100 84 54 T
0101 0101 85 55 U
0101 0110 86 56 V
0101 0111 87 57 W
0101 1000 88 58 X
0101 1001 89 59 Y
0101 1010 90 5A Z
0101 1011 91 5B [
0101 1100 92 5C \
0101 1101 93 5D ]
0101 1110 94 5E ^
0101 1111 95 5F _
   
Bin Dec Hex Znak Skrót
0110 0000 96 60 `
0110 0001 97 61 a
0110 0010 98 62 b
0110 0011 99 63 c
0110 0100 100 64 d
0110 0101 101 65 e
0110 0110 102 66 f
0110 0111 103 67 g
0110 1000 104 68 h
0110 1001 105 69 i
0110 1010 106 6A j
0110 1011 107 6B k
0110 1100 108 6C l
0110 1101 109 6D m
0110 1110 110 6E n
0110 1111 111 6F o
0111 0000 112 70 p
0111 0001 113 71 q
0111 0010 114 72 r
0111 0011 115 73 s
0111 0100 116 74 t
0111 0101 117 75 u
0111 0110 118 76 v
0111 0111 119 77 w
0111 1000 120 78 x
0111 1001 121 79 y
0111 1010 122 7A z
0111 1011 123 7B {
0111 1100 124 7C |
0111 1101 125 7D }
0111 1110 126 7E ~
0111 1111 127 7F Delete DEL

Zobacz też edytuj

Przypisy edytuj

  1. Character Sets. iana.org. [dostęp 2018-07-15]. (ang.).
  2. Mary Brandel: 1963: The Debut of ASCII. CNN, 6-07-1999. [dostęp 2018-07-16]. (ang.).
  3. a b c American Standard Code for Information Interchange, ASA X3.4-1963. American Standards Association (ASA), 1963-06-17. [dostęp 2018-07-16]. (ang.).
  4. a b Dik T. Winter: US and International standards: ASCII. [dostęp 2018-07-16]. (ang.).
  5. a b c d e f Tuomas Salste: 7-bit character sets: Revisions of ASCII. [dostęp 2018-07-16]. [zarchiwizowane z tego adresu (2016-06-13)]. (ang.).
  6. USA Standard Code for Information Interchange, USAS X3.4-1967, United States of America Standards Institute (USASI), 7 lipca 1967 (ang.).
  7. Thomas Daniel Jennings: An annotated history of some character codes or ASCII: American Standard Code for Information Infiltration. World Power Systems (WPS), 2016-04-20. [dostęp 2018-07-16]. (ang.).
  8. a b Mackenzie ↓.
  9. American National Standard for Information Systems — Coded Character Sets — 7-Bit American National Standard Code for Information Interchange (7-Bit ASCII), ANSI X3.4-1986, American National Standards Institute (ANSI), 26 marca 1986 (ang.).
  10. R. Shirey, Internet Security Glossary, Version 2, FYI 36, RFC 4949, IETF, sierpień 2007, DOI10.17487/RFC4949, ISSN 2070-1721, OCLC 943595667 (ang.).
  11. Anil Kumar Maini: Digital Electronics: Principles, Devices and Applications. John Wiley and Sons, 2007, s. 28. ISBN 978-0-470-03214-5. Cytat: In addition, it defines codes for 33 nonprinting, mostly obsolete control characters that affect how the text is processed.. (ang.).
  12. Karl Dubost: UTF-8 Growth on the Web. World Wide Web Consortium, 2008-05-06. [dostęp 2018-07-18]. [zarchiwizowane z tego adresu (2016-06-16)]. (ang.).
  13. Mark Davis: Moving to Unicode 5.1. Google Blog, 2008-05-05. [dostęp 2018-07-18]. [zarchiwizowane z tego adresu (2016-06-16)]. (ang.).
  14. Mark Davis: Unicode nearing 50% of the web. Google Blog, 2010-01-28. [dostęp 2018-07-18]. [zarchiwizowane z tego adresu (2016-06-16)]. (ang.).
  15. Ed Bukstein. Binary Computer Codes and ASCII. „Electronics World”. 72, s. 28–29, 07 1964. Poptronix Inc.. [dostęp 2016-05-22]. (ang.). 
  16. Mackenzie ↓, s. 66, 245.
  17. Mackenzie ↓, s. 435.
  18. a b c Chapter 1: Inside ASCII. W: Robert William Bemer: General Purpose Software. Portland, OR, USA: dilithium Press, 1980, s. 1–50, seria: Best of Interface Age. ISBN 0-918398-37-1. LCCN 79-67462. [dostęp 2018-07-16]. (ang.).
  19. Brief Report: Meeting of CCITT Working Party on the New Telegraph Alphabet, May 13–15, 1963. (ang.).
  20. Report of Meeting No. 8, Task Group X3.2.4, December 17 and 18, 1963 (ang.).
  21. Mackenzie ↓, s. 247–248.
  22. BruXy: Radio Teletype communication. 2005-10-10. [dostęp 2018-07-16]. Cytat: The transmitted code use International Telegraph Alphabet No. 2 (ITA-2) which was introduced by CCITT in 1924. (ang.).
  23. Gil Smith: Teletype Communication Codes. Baudot.net, 2001. [dostęp 2018-07-16]. (ang.).
  24. Mackenzie ↓, s. 215, 236 §4.
  25. Mackenzie ↓, s. 217, 236 §5.
  26. Stanley A. Sawyer, Steven George Krantz: A TeX Primer for Scientists. CRC Press, LLC, 1995, s. 13. ISBN 978-0-8493-7159-2. (ang.).
  27. Mackenzie ↓, s. 220, 236 §8,9.
  28. Mackenzie ↓, s. 237 §10.
  29. Mackenzie ↓, s. 228, 237 §14.
  30. Mackenzie ↓, s. 238 §18.
  31. John J. G. Savard: Computer Keyboards. [dostęp 2018-07-17]. (ang.).
  32. Mackenzie ↓, s. 243.
  33. Mackenzie ↓, s. 243–245.
  34. Jim Haynes: First-Hand: Chad is Our Most Important Product: An Engineer's Memory of Teletype Corporation. Engineering and Technology History Wiki (ETHW), 2015-01-13. [dostęp 2018-07-17]. [zarchiwizowane z tego adresu (2016-10-31)]. (ang.).
  35. ASCII Table: 7-bit. [dostęp 2018-07-18]. [zarchiwizowane z tego adresu (2018-07-09)]. (ang.).
  36. Czcionki i polskie znaki w CPC. [dostęp 2018-07-18].
  37. utf-8(7) – Linux manual page. Man7.org, 2014-02-26. [dostęp 2014-04-21]. (ang.).

Uwagi edytuj

  1. Znaki w kodzie ASCII zostały podzielone na osiem grup po 16 znaków w każdej, nazywane po angielsku sticks. Grupy ponumerowano od 0 do 7, zgodnie z trzema najstarszymi bitami. Na ilustracji na początku artykułu patyki odpowiadają kolumnom w tabeli kodu ASCII.

Bibliografia edytuj

Linki zewnętrzne edytuj