Czym jest kodowanie znaków
Kodowanie to umowa: «liczba 65 oznacza literę A». Gdy piszesz tekst, program zapisuje te liczby; gdy ktoś inny go otwiera, jego program zamienia je z powrotem na litery według tej samej umowy. Jeśli obie strony nie używają tej samej tabeli, tekst wychodzi źle.
Trzeba rozróżnić dwie sprawy. Jedna to zestaw znaków, czyli lista tego, które liczby odpowiadają którym symbolom. Druga to sposób, w jaki te liczby są zapisywane w bajtach. W ASCII te dwie rzeczy pokrywają się w prosty sposób; w Unicode nie, i tu wchodzi UTF-8.
ASCII: 128 znaków zapisanych na 7 bitach
ASCII (skrót od American Standard Code for Information Interchange) ustandaryzowano w latach sześćdziesiątych. Używa 7 bitów, czyli 2 do potęgi 7 = 128 kodów, od 0 do 127. Spośród nich 33 to znaki sterujące (od 0 do 31 oraz 127), a 95 to znaki drukowalne (od 32 do 126, łącznie ze spacją).
Nie zawiera liter z ogonkami, ani ł, ani symbolu euro: zaprojektowano je dla angielskiego. To wyjaśnia, dlaczego później potrzebne były inne tabele.
| Znak sterujący | Dziesiętnie | Szesnastkowo | Binarnie (7 bitów) | Do czego służy |
|---|---|---|---|---|
| Znak pusty (NUL) | 0 | 00 | 0000000 | W wielu językach oznacza koniec ciągu znaków |
| Tabulacja pozioma (TAB) | 9 | 09 | 0001001 | Przeskakuje do następnego tabulatora |
| Nowa linia (LF) | 10 | 0A | 0001010 | Przechodzi do następnego wiersza |
| Powrót karetki (CR) | 13 | 0D | 0001101 | Wraca na początek wiersza |
| Escape (ESC) | 27 | 1B | 0011011 | Rozpoczyna sekwencje sterujące |
| Spacja | 32 | 20 | 0100000 | Pierwszy znak drukowalny |
| Usuń (DEL) | 127 | 7F | 1111111 | Usuwa znak |
Zależności, które warto zapamiętać
Tabela nie jest ułożona przypadkowo. Znając kilka reguł, możesz czytać kody z pamięci.
- Cyfry od «0» do «9» zajmują kody od 48 do 57 (od 30 do 39 szesnastkowo). Wartość cyfry to jej kod minus 48: «7» to 55, a 55 − 48 = 7.
- Wielkie litery idą od 65 («A») do 90 («Z»), a małe od 97 («a») do 122 («z»).
- Różnica między wielką literą a jej małym odpowiednikiem to zawsze 32: «A» = 65 i «a» = 97; «C» = 67 i «c» = 99. W zapisie binarnym zmienia się tylko jeden bit: 01000001 dla «A» i 01100001 dla «a».
- Aby sprawdzić, które miejsce w alfabecie zajmuje wielka litera, odejmij 64: «C» to 67, a 67 − 64 = 3, trzecia litera.
- Ponieważ wszystkie wielkie litery (65–90) mają kody mniejsze niż małe (97–122), porządek alfabetyczny «według kodu» stawia «Zebra» przed «jabłko». Wiele programów potrzebuje osobnej opcji porównywania, aby dobrze sortować.
Koniec wiersza: LF, CR i CRLF
Przejście do nowego wiersza wydaje się proste, ale zapisuje się je inaczej zależnie od systemu. Unix, Linux i macOS używają jednego znaku, LF (10). Windows używa dwóch kolejnych, CR i LF (13 i 10), znanych jako CRLF. Dawne dalekopisy potrzebowały dwóch osobnych poleceń: cofnięcia karetki na początek i przesunięcia papieru o jeden wiersz.
Ta różnica jest przyczyną plików, które w prostym edytorze wyglądają jak jeden długi wiersz albo mają dziwny symbol na końcu każdej linijki. Jeśli chcesz sprawdzić, jaki kod ma każdy z nich, wpisz LF lub CR w wyszukiwarkę tabeli ASCII.
«Rozszerzone ASCII» to nie standard
Ponieważ bajt ma 8 bitów, a ASCII używa tylko 7, zostawało 128 wolnych kodów (od 128 do 255) i każdy producent oraz region wypełniał je po swojemu. Nazywa się to «rozszerzonym ASCII», ale nie istnieje jedna tabela: jest ich wiele, zwanych stronami kodowymi. Dwie z najbardziej znanych to Latin-1 (ISO-8859-1), w której é ma kod 233, oraz Windows-1252, podobna, ale z różnicami w kodach od 128 do 159 (tam jest na przykład euro). Dla polskich liter powstały osobne tabele, takie jak ISO-8859-2 i Windows-1250.
Problem w tym, że kod 233 oznacza «é» w jednej tabeli, a w innej coś innego. Tekst napisany według jednej tabeli i odczytany według drugiej pokazywał krzaczki. Unicode powstał, aby skończyć z tym bałaganem.
Unicode i UTF-8
Unicode przypisuje unikalną liczbę, zwaną punktem kodowym, każdemu znakowi prawie wszystkich systemów pisma na świecie, a także symbolom i emoji. Dziś ma ponad 150 000 znaków. Zapisuje się go z przedrostkiem U+ i szesnastkowo: «A» to U+0041, «ł» to U+0142, euro to U+20AC, a emoji uśmiechniętej buźki to U+1F600. Pierwsze 128 punktów kodowych to dokładnie te z ASCII.
UTF-8 to najczęściej używany sposób zapisywania tych liczb w bajtach i zajmuje od 1 do 4 bajtów zależnie od znaku. 128 znaków ASCII zajmuje jeden bajt, identyczny jak zawsze, więc tekst ASCII jest też poprawnym tekstem UTF-8. Reszta zajmuje więcej bajtów.
| Znak | Punkt kodowy | Bajty w UTF-8 | Bajty (szesnastkowo) |
|---|---|---|---|
| A | U+0041 | 1 | 41 |
| é | U+00E9 | 2 | C3 A9 |
| ł | U+0142 | 2 | C5 82 |
| € | U+20AC | 3 | E2 82 AC |
| 😀 | U+1F600 | 4 | F0 9F 98 80 |
Dlaczego pojawia się «Ã³» zamiast «ó»
To najczęstszy błąd i ma dokładne wyjaśnienie. Litera ó w UTF-8 to dwa bajty: C3 i B3. Jeśli program uważa, że tekst jest w Latin-1, czyta każdy bajt jako osobny znak: C3 to «Ã», a B3 to «³». Wynik: «Ã³». To samo dzieje się z «é», które wygląda jak «Ã©», i ze słowem «ból», które pojawia się jako «ból».
Rozwiązaniem prawie zawsze jest wskazanie programowi, aby otworzył plik jako UTF-8 (w edytorze tekstu albo w ustawieniach importu arkusza kalkulacyjnego). Gdy dzieje się odwrotnie, czyli tekst w Latin-1 jest czytany jako UTF-8, zwykle pojawiają się romby ze znakiem zapytania, bo te pojedyncze bajty nie tworzą poprawnych sekwencji UTF-8.
Jak korzystać z tabeli ASCII i konwertera
Narzędzie «Tabela ASCII» pokazuje 128 znaków z ich kodem dziesiętnym, szesnastkowym, ósemkowym i binarnym oraz nazwę znaków sterujących.
- Wpisz w wyszukiwarce znak, kod albo nazwę znaku sterującego (na przykład A, 65, 41 lub LF), aby znaleźć jego wiersz.
- Użyj przycisków filtrów (Sterujące, Cyfry, Wielkie litery, Małe litery, Znaki), aby zobaczyć tylko jedną grupę.
- Aby przeliczyć, wpisz tekst w polu «Tekst» i wybierz format (dziesiętny, szesnastkowy, ósemkowy lub binarny): poniżej pojawią się kody. «Hola» daje 72 111 108 97 dziesiętnie i 48 6F 6C 61 szesnastkowo.
- Możesz też zrobić odwrotnie: wklej kody oddzielone spacjami lub przecinkami w polu «Kody», a powstanie tekst. W systemie szesnastkowym akceptowane są przedrostki takie jak 0x41.
Jeśli tekst zawiera znaki spoza ASCII, takie jak ł, narzędzie o tym informuje i pokazuje ich kod Unicode. Aby zobaczyć rzeczywiste bajty w UTF-8, użyj «Tekst na kod binarny»: ł daje 11000101 10000010, dwa bajty po 8 bitów. Ograniczenia: tabela pokazuje tylko standardowe ASCII, nie rozszerzone, a wszystko jest liczone w Twojej przeglądarce, bez wysyłania tekstu na jakikolwiek serwer.
Najczęstsze pytania
Ile znaków ma ASCII?
128, z kodami od 0 do 127, po 7 bitów każdy. Spośród nich 33 to znaki sterujące, a 95 to znaki drukowalne, licząc spację.
Jaki jest kod ASCII litery A i litery a?
«A» to 65 (41 szesnastkowo, 01000001 binarnie), a «a» to 97 (61 szesnastkowo, 01100001 binarnie). Zawsze różnią się o 32.
Jaka jest różnica między ASCII a Unicode?
ASCII ma 128 znaków przeznaczonych dla angielskiego. Unicode ma ich ponad 150 000, z prawie wszystkich języków oraz emoji, a jego pierwsze 128 są takie same jak w ASCII.
Czym jest UTF-8?
To najczęściej używany sposób zapisywania tekstu Unicode w bajtach. Używa od 1 do 4 bajtów na znak: znaki ASCII zajmują jeden, litera ł dwa, a emoji cztery.
Dlaczego mój tekst pokazuje «Ã³» lub «Ã©»?
Bo tekst zapisany w UTF-8 jest czytany jako Latin-1. Otwórz plik, wskazując kodowanie UTF-8, i problem zniknie.