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 (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[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

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

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

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)[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

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ł

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

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[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

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

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

Tabela kodów ASCII

BinDecHexZnakSkrót
0000 0000000NullNUL
0000 0001101Start of HeadingSOH
0000 0010202Start of TextSTX
0000 0011303End of TextETX
0000 0100404End of TransmissionEOT
0000 0101505EnquiryENQ
0000 0110606AcknowledgeACK
0000 0111707BellBEL
0000 1000808BackspaceBS
0000 1001909Horizontal TabHT
0000 1010100ALine FeedLF
0000 1011110BVertical TabVT
0000 1100120CForm FeedFF
0000 1101130DCarriage ReturnCR
0000 1110140EShift OutSO
0000 1111150FShift InSI
0001 00001610Data Link EscapeDLE
0001 00011711Device Control 1 (XON)DC1
0001 00101812Device Control 2DC2
0001 00111913Device Control 3 (XOFF)DC3
0001 01002014Device Control 4DC4
0001 01012115Negative AcknowledgeNAK
0001 01102216Synchronous IdleSYN
0001 01112317End of Transmission BlockETB
0001 10002418CancelCAN
0001 10012519End of MediumEM
0001 1010261ASubstituteSUB
0001 1011271BEscapeESC
0001 1100281CFile SeparatorFS
0001 1101291DGroup SeparatorGS
0001 1110301ERecord SeparatorRS
0001 1111311FUnit SeparatorUS
   
BinDecHexZnak
0010 00003220Spacja
0010 00013321!
0010 00103422"
0010 00113523#
0010 01003624$
0010 01013725%
0010 01103826&
0010 01113927'
0010 10004028(
0010 10014129)
0010 1010422A*
0010 1011432B+
0010 1100442C,
0010 1101452D-
0010 1110462E.
0010 1111472F/
0011 000048300
0011 000149311
0011 001050322
0011 001151333
0011 010052344
0011 010153355
0011 011054366
0011 011155377
0011 100056388
0011 100157399
0011 1010583A:
0011 1011593B;
0011 1100603C<
0011 1101613D=
0011 1110623E>
0011 1111633F?
   
BinDecHexZnak
0100 00006440@
0100 00016541A
0100 00106642B
0100 00116743C
0100 01006844D
0100 01016945E
0100 01107046F
0100 01117147G
0100 10007248H
0100 10017349I
0100 1010744AJ
0100 1011754BK
0100 1100764CL
0100 1101774DM
0100 1110784EN
0100 1111794FO
0101 00008050P
0101 00018151Q
0101 00108252R
0101 00118353S
0101 01008454T
0101 01018555U
0101 01108656V
0101 01118757W
0101 10008858X
0101 10018959Y
0101 1010905AZ
0101 1011915B[
0101 1100925C\
0101 1101935D]
0101 1110945E^
0101 1111955F_
   
BinDecHexZnakSkrót
0110 00009660`
0110 00019761a
0110 00109862b
0110 00119963c
0110 010010064d
0110 010110165e
0110 011010266f
0110 011110367g
0110 100010468h
0110 100110569i
0110 10101066Aj
0110 10111076Bk
0110 11001086Cl
0110 11011096Dm
0110 11101106En
0110 11111116Fo
0111 000011270p
0111 000111371q
0111 001011472r
0111 001111573s
0111 010011674t
0111 010111775u
0111 011011876v
0111 011111977w
0111 100012078x
0111 100112179y
0111 10101227Az
0111 10111237B{
0111 11001247C|
0111 11011257D}
0111 11101267E~
0111 11111277FDeleteDEL

Zobacz też

  • Ascii85
  • ASCII-Art
  • Basic Latin (blok Unicode)
  • Extended ASCII

Przypisy

  1. Character Sets (ang.). iana.org. [dostęp 2018-07-15].
  2. Mary Brandel: 1963: The Debut of ASCII (ang.). CNN, 6-07-1999. [dostęp 2018-07-16].
  3. a b c American Standard Code for Information Interchange, ASA X3.4-1963 (ang.). American Standards Association (ASA), 1963-06-17. [dostęp 2018-07-16].
  4. a b Dik T. Winter: US and International standards: ASCII (ang.). [dostęp 2018-07-16].
  5. a b c d e f Tuomas Salste: 7-bit character sets: Revisions of ASCII (ang.). [dostęp 2018-07-16]. [zarchiwizowane z tego adresu (2016-06-13)].
  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 (ang.). World Power Systems (WPS), 2016-04-20. [dostęp 2018-07-16].
  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 (ang.). World Wide Web Consortium, 2008-05-06. [dostęp 2018-07-18]. [zarchiwizowane z tego adresu (2016-06-16)].
  13. Mark Davis: Moving to Unicode 5.1 (ang.). Google Blog, 2008-05-05. [dostęp 2018-07-18]. [zarchiwizowane z tego adresu (2016-06-16)].
  14. Mark Davis: Unicode nearing 50% of the web (ang.). Google Blog, 2010-01-28. [dostęp 2018-07-18]. [zarchiwizowane z tego adresu (2016-06-16)].
  15. Ed Bukstein. Binary Computer Codes and ASCII. „Electronics World”. 72, s. 28–29, 07 1964. Poptronix Inc. (ang.). [dostęp 2016-05-22]. 
  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 (ang.). 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.
  23. Gil Smith: Teletype Communication Codes (ang.). Baudot.net, 2001. [dostęp 2018-07-16].
  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 (ang.). [dostęp 2018-07-17].
  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 (ang.). Engineering and Technology History Wiki (ETHW), 2015-01-13. [dostęp 2018-07-17]. [zarchiwizowane z tego adresu (2016-10-31)].
  35. ASCII Table: 7-bit (ang.). [dostęp 2018-07-18]. [zarchiwizowane z tego adresu (2018-07-09)].
  36. Czcionki i polskie znaki w CPC. [dostęp 2018-07-18].
  37. utf-8(7) – Linux manual page (ang.). Man7.org, 2014-02-26. [dostęp 2014-04-21].

Uwagi

  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

Linki zewnętrzne

Media użyte na tej stronie

USASCII code chart.png
US-ASCII Code Chart. Scanner copied from the material delivered with TermiNet 300 impact type printer with Keyboard, February 1972, General Electric Data communication Product Dept., Waynesboro, Virginia.
ASCII full.svg
Autor: Arite, Licencja: CC-BY-SA-3.0
Complete set of printable ASCII characters. This image is an SVG version of Ascii full.png. Modified version uploaded on 2007-01-09 with text converted to paths.