Skip to content

Tablica ASCII i konwerter ASCII

Pełna tablica ASCII: 128 znaków w systemie dziesiętnym, szesnastkowym, ósemkowym i dwójkowym oraz dwukierunkowy konwerter. Znaki sterujące z sekwencjami escape, notacją z daszkiem i miejscem, gdzie naprawdę się je spotyka.

Bez śledzenia Działa w przeglądarce Bezpłatne

Wszystko działa w przeglądarce — dane wejściowe nigdy nie są wysyłane, rejestrowane ani przechowywane.

Tekst i kod ASCII w obie strony

Pełna tablica ASCII (0-127)

128 / 128
Dziesiętnie Szesnastkowo Ósemkowo Dwójkowo Znak Nazwa Escape Caret HTML Gdzie występuje w praktyce
0 00 000 00000000 NUL Null \0 ^@ � Kończy łańcuchy znaków w C; rozdziela nazwy plików w find -print0 i xargs -0; grep zgłasza wtedy Binary file matches.
1 01 001 00000001 SOH Start of Heading ^A  Protokół FIX używa go jako separatora pól, dlatego komunikaty FIX wyglądają jak jeden ciągnący się wiersz.
2 02 002 00000010 STX Start of Text ^B  Nagłówek ramki w protokołach szeregowych, kasach fiskalnych i czytnikach kodów kreskowych; prefiks tmux Ctrl+B.
3 03 003 00000011 ETX End of Text ^C  Ctrl+C wysyła właśnie ten bajt; dyscyplina linii tty zamienia go w SIGINT, więc program nigdy go nie widzi.
4 04 004 00000100 EOT End of Transmission ^D  Ctrl+D zatwierdza bieżący wiersz wejścia; gdy wiersz jest pusty, odczyt zwraca 0 bajtów i to jest EOF.
5 05 005 00000101 ENQ Enquiry ^E  Dawne uzgadnianie łącza; niektóre terminale odpowiadają na niego ciągiem identyfikacyjnym.
6 06 006 00000110 ACK Acknowledge ^F  W parze z ENQ i NAK w dawnych protokołach warstwy łącza; wciąż spotykany w przemysłowym sprzęcie szeregowym.
7 07 007 00000111 BEL Bell \a ^G  printf '\a' uruchamia dzwonek; dziś częściej kończy sekwencję OSC, na przykład przy ustawianiu tytułu okna.
8 08 010 00001000 BS Backspace \b ^H  Wymazywanie w paskach postępu. Uwaga: większość terminali wysyła dla Backspace bajt 0x7F, a nie ten.
9 09 011 00001001 HT Character Tabulation \t ^I 	 Reguły w Makefile muszą zaczynać się prawdziwym tabulatorem; gofmt wcina tabulatorami; Tab i Ctrl+I to ten sam bajt.
10 0A 012 00001010 LF Line Feed \n ^J 
 Koniec wiersza w Unix i macOS; core.autocrlf w git przekształca między tym bajtem a CRLF.
11 0B 013 00001011 VT Line Tabulation \v ^K  Prawie wymarły, ale wciąż liczy się jako złamanie wiersza: splitlines() dzieli na nim, a split("\n") już nie.
12 0C 014 00001100 FF Form Feed \f ^L  Wysuw strony w drukarce; Ctrl+L czyści terminal; Emacs używa go jako znacznika sekcji w kodzie źródłowym.
13 0D 015 00001101 CR Carriage Return \r ^M 
 Pierwsza połowa windowsowego CRLF; w git diff pokazuje się jako ^M; powoduje bad interpreter: /bin/bash^M.
14 0E 016 00001110 SO Shift Out ^N  W ISO 2022 przełącza na alternatywny zestaw znaków G1; obejmuje obszary dwubajtowe na mainframe'ach EBCDIC.
15 0F 017 00001111 SI Shift In ^O  Przełącza z powrotem na domyślny zestaw znaków G0, w parze z SO.
16 10 020 00010000 DLE Data Link Escape ^P  Prefiks ucieczki przy wypełnianiu bajtami w starszych protokołach binarnych.
17 11 021 00010001 DC1 Device Control One ^Q  XON — wznowienie programowej kontroli przepływu; Ctrl+Q odmraża wyjście terminala.
18 12 022 00010010 DC2 Device Control Two ^R  Bez ustalonego współczesnego znaczenia. Ctrl+R w powłoce to skrót readline, niezwiązany z tym kodem.
19 13 023 00010011 DC3 Device Control Three ^S  XOFF — wstrzymanie programowej kontroli przepływu. Przypadkowe Ctrl+S to najczęstsza przyczyna zamrożonego terminala.
20 14 024 00010100 DC4 Device Control Four ^T  Bez ustalonego współczesnego znaczenia; w BSD i macOS Ctrl+T to klawisz stanu tty.
21 15 025 00010101 NAK Negative Acknowledge ^U  Ctrl+U kasuje cały wiersz — to ustawienie kill w tty, a nie pierwotne znaczenie tego kodu.
22 16 026 00010110 SYN Synchronous Idle ^V  Ctrl+V to lnext: najpierw ono, potem Tab, żeby wpisać w bash prawdziwy tabulator bez uruchamiania uzupełniania.
23 17 027 00010111 ETB End of Transmission Block ^W  Ctrl+W kasuje poprzednie słowo — ustawienie werase w tty.
24 18 030 00011000 CAN Cancel ^X  ECMA-48 przerywa nim niedokończoną sekwencję sterującą; terminale odrzucają właśnie analizowaną sekwencję.
25 19 031 00011001 EM End of Medium ^Y  Dziś używany rzadko; w BSD i macOS Ctrl+Y to opóźnione wstrzymanie procesu.
26 1A 032 00011010 SUB Substitute ^Z  Znacznik końca pliku w plikach tekstowych CP/M i DOS, dlatego w konsoli Windows kończy się wejście przez Ctrl+Z.
27 1B 033 00011011 ESC Escape ^[  Początek każdej sekwencji ANSI: \033[0m przywraca kolor, \033[2J czyści ekran. Ctrl+[ wysyła go tak samo.
28 1C 034 00011100 FS File Separator ^\  Ramkowanie MLLP w HL7 v2 używa go jako końca bloku; Ctrl+\ wysyła SIGQUIT.
29 1D 035 00011101 GS Group Separator ^]  W kodach kreskowych GS1 separator FNC1 to właśnie ten bajt — niewidoczny separator wypluwany przez czytnik.
30 1E 036 00011110 RS Record Separator ^^  RFC 7464 JSON Text Sequences poprzedza nim każdy rekord. Jedno z niewielu żywych współczesnych zastosowań.
31 1F 037 00011111 US Unit Separator ^_  Separator pól w tekście strukturalnym, bezpieczniejszy od przecinka, bo nigdy nie występuje w samych danych.
32 20 040 00100000 Space  
33 21 041 00100001 Exclamation Mark !
34 22 042 00100010 Quotation Mark "
35 23 043 00100011 Number Sign #
36 24 044 00100100 Dollar Sign $
37 25 045 00100101 Percent Sign %
38 26 046 00100110 Ampersand &
39 27 047 00100111 Apostrophe '
40 28 050 00101000 Left Parenthesis (
41 29 051 00101001 Right Parenthesis )
42 2A 052 00101010 Asterisk *
43 2B 053 00101011 Plus Sign +
44 2C 054 00101100 Comma ,
45 2D 055 00101101 Hyphen-Minus -
46 2E 056 00101110 Full Stop .
47 2F 057 00101111 Solidus /
48 30 060 00110000 Digit Zero 0
49 31 061 00110001 Digit One 1
50 32 062 00110010 Digit Two 2
51 33 063 00110011 Digit Three 3
52 34 064 00110100 Digit Four 4
53 35 065 00110101 Digit Five 5
54 36 066 00110110 Digit Six 6
55 37 067 00110111 Digit Seven 7
56 38 070 00111000 Digit Eight 8
57 39 071 00111001 Digit Nine 9
58 3A 072 00111010 Colon :
59 3B 073 00111011 Semicolon &#59;
60 3C 074 00111100 Less-Than Sign <
61 3D 075 00111101 Equals Sign =
62 3E 076 00111110 Greater-Than Sign >
63 3F 077 00111111 Question Mark ?
64 40 100 01000000 Commercial At @
65 41 101 01000001 Latin Capital Letter A A
66 42 102 01000010 Latin Capital Letter B B
67 43 103 01000011 Latin Capital Letter C C
68 44 104 01000100 Latin Capital Letter D D
69 45 105 01000101 Latin Capital Letter E E
70 46 106 01000110 Latin Capital Letter F F
71 47 107 01000111 Latin Capital Letter G G
72 48 110 01001000 Latin Capital Letter H H
73 49 111 01001001 Latin Capital Letter I I
74 4A 112 01001010 Latin Capital Letter J J
75 4B 113 01001011 Latin Capital Letter K K
76 4C 114 01001100 Latin Capital Letter L L
77 4D 115 01001101 Latin Capital Letter M M
78 4E 116 01001110 Latin Capital Letter N N
79 4F 117 01001111 Latin Capital Letter O O
80 50 120 01010000 Latin Capital Letter P P
81 51 121 01010001 Latin Capital Letter Q Q
82 52 122 01010010 Latin Capital Letter R R
83 53 123 01010011 Latin Capital Letter S S
84 54 124 01010100 Latin Capital Letter T T
85 55 125 01010101 Latin Capital Letter U U
86 56 126 01010110 Latin Capital Letter V V
87 57 127 01010111 Latin Capital Letter W W
88 58 130 01011000 Latin Capital Letter X X
89 59 131 01011001 Latin Capital Letter Y Y
90 5A 132 01011010 Latin Capital Letter Z Z
91 5B 133 01011011 Left Square Bracket [
92 5C 134 01011100 Reverse Solidus \
93 5D 135 01011101 Right Square Bracket ]
94 5E 136 01011110 Circumflex Accent ^
95 5F 137 01011111 Low Line _
96 60 140 01100000 Grave Accent `
97 61 141 01100001 Latin Small Letter A a
98 62 142 01100010 Latin Small Letter B b
99 63 143 01100011 Latin Small Letter C c
100 64 144 01100100 Latin Small Letter D d
101 65 145 01100101 Latin Small Letter E e
102 66 146 01100110 Latin Small Letter F f
103 67 147 01100111 Latin Small Letter G g
104 68 150 01101000 Latin Small Letter H h
105 69 151 01101001 Latin Small Letter I i
106 6A 152 01101010 Latin Small Letter J j
107 6B 153 01101011 Latin Small Letter K k
108 6C 154 01101100 Latin Small Letter L l
109 6D 155 01101101 Latin Small Letter M m
110 6E 156 01101110 Latin Small Letter N n
111 6F 157 01101111 Latin Small Letter O o
112 70 160 01110000 Latin Small Letter P p
113 71 161 01110001 Latin Small Letter Q q
114 72 162 01110010 Latin Small Letter R r
115 73 163 01110011 Latin Small Letter S s
116 74 164 01110100 Latin Small Letter T t
117 75 165 01110101 Latin Small Letter U u
118 76 166 01110110 Latin Small Letter V v
119 77 167 01110111 Latin Small Letter W w
120 78 170 01111000 Latin Small Letter X x
121 79 171 01111001 Latin Small Letter Y y
122 7A 172 01111010 Latin Small Letter Z z
123 7B 173 01111011 Left Curly Bracket {
124 7C 174 01111100 Vertical Line |
125 7D 175 01111101 Right Curly Bracket }
126 7E 176 01111110 Tilde ~
127 7F 177 01111111 DEL Delete ^?  To właśnie ten bajt wysyła klawisz Backspace w większości terminali. Nazwa od taśmy: wszystkie siedem otworów wybite.

Kolumna dwójkowa jest dla czytelności uzupełniona do 8 bitów. Samo ASCII to kod 7-bitowy — najstarszy bit zawsze wynosi 0, i właśnie dzięki temu UTF-8 pozostaje z nim wstecznie zgodny.

A co z zakresem 128-255?

ASCII w ogóle nie definiuje zakresu 128-255. „Rozszerzone ASCII” nie jest nazwą żadnego standardu — to potoczne określenie całej rodziny kodowań 8-bitowych. Ten sam bajt jest w każdym z nich innym znakiem:

Bajt ISO-8859-1 Windows-1252 CP437 CP866
0x80 U+0080 znak sterujący C1 (niewidoczny) Ç А
0x93 U+0093 znak sterujący C1 (niewidoczny) ô У
0xB0 ° °
0xE9 é é Θ щ
0xFF ÿ ÿ U+00A0 U+00A0
Klasyfikacja znaków jest w testach porównywana z kategoriami samego Unicode, a odwzorowanie Windows-1252 zweryfikowano bajt po bajcie względem dekodera platformy. — Zespół inżynierski Go-Tools · Sep 2, 2026

Każda wartość w tablicy powstaje w jednym silniku, który uruchamiają zarówno serwer, jak i przeglądarka, więc to, co czyta robot wyszukiwarki, i to, z czym pracuje użytkownik, nie mogą się rozjechać. Różnice w sekwencjach escape między językami zostały sprawdzone przez skompilowanie i uruchomienie kodu w każdym z nich, a nie zacytowane z pamięci.

Szybka ściąga

Jaki jest kod ASCII litery A?

A = 65 Wielkie `A` to 65 dziesiętnie, `0x41` szesnastkowo, `101` ósemkowo i `01000001` dwójkowo. Małe `a` to 97 — dokładnie 32 więcej, czyli jeden bit różnicy.

Ile znaków ma ASCII?

128 128, ponumerowanych od 0 do 127. To 32 znaki sterujące, 95 znaków graficznych łącznie ze spacją oraz DEL.

Czym jest ASCII 0?

0 = NUL NUL, znak pusty. Kończy łańcuchy znaków w języku C, rozdziela nazwy plików w `find -print0` i sprawia, że `grep` traktuje plik jako binarny.

Który bajt jest znakiem nowego wiersza?

LF = 10, CR = 13 Wysuw wiersza to 10 (`0x0A`, `\n`). Powrót karetki to 13 (`0x0D`, `\r`). Windowsowy koniec wiersza to oba naraz, najpierw CR.

Czym jest ASCII?

ASCII to kodowanie znaków 7-bitowe — 128 punktów kodowych, ponumerowanych od 0 do 127, i ani jednego więcej. Po raz pierwszy opublikowano je jako ASA X3.4-1963, a obecna postać to ANSI X3.4-1986; RFC 20 opisuje jego użycie w internecie i w 2015 roku został podniesiony do rangi Internet Standard STD 80. Pierwsza wersja nie miała w ogóle małych liter; pojawiły się dopiero w rewizji z 1967 roku. Wszystko powyżej 127 należy już do innego kodowania, nie do ASCII.

0x00-0x1F   32 C0 control characters
0x20         1 space (a graphic character, not a control)
0x21-0x7E   94 printable graphic characters
0x7F         1 DEL (a control character, but not part of C0)
            ---
            128 total

Co daje ta tablica

Cztery systemy liczbowe obok siebie

Zapis dziesiętny, szesnastkowy, ósemkowy i dwójkowy na 8 bitach dla każdego ze 128 punktów kodowych, z wiodącym zerem przypominającym, że ASCII jest w rzeczywistości 7-bitowe.

Sekwencje escape w poszczególnych językach

Kolumna \0 \a \b \t \n \v \f \r oraz te różnice, które naprawdę psują budowanie projektu — JavaScript nie ma \a, Java nie ma ani \a, ani \v, a \e to rozszerzenie GNU, a nie standard ISO C.

Notacja z daszkiem

Kolumna od ^@ do ^? i jedna reguła obejmująca wszystkie 33 znaki sterujące: XOR bajtu z 0x40. Nie dodawanie, nie odejmowanie — XOR.

Gdzie każdy znak sterujący występuje naprawdę

Nie tylko „SOH — start of heading”, ale też to, że komunikaty protokołu FIX używają go jako separatora pól, że 0x1D to niewidoczny separator wypluwany przez czytnik kodów kreskowych, a zamrożony przez Ctrl+S terminal to XOFF.

Konwerter, który nie zgaduje

System liczbowy wybiera użytkownik. Bajty powyżej 127 są odrzucane wraz z informacją, jak czytałyby się w Windows-1252 i w ISO-8859-1, zamiast uchodzić za ASCII.

Znaki sterujące pozostają widoczne

NUL, TAB i CR nie mają glifu, więc podgląd pokazuje je jako znaki Unicode Control Pictures. Przycisk kopiowania nadal zwraca prawdziwe bajty.

Pokrewne kodowania

ISO/IEC 8859-1 (Latin-1)

8-bitowe, jeden bajt

Zakres 0-127 pozostawia identyczny z ASCII i definiuje 96 znaków graficznych od 0xA0 do 0xFF. Zakres 0x80-0x9F jest zarezerwowany dla niewidocznych znaków sterujących C1.

Windows-1252

8-bitowe, jeden bajt

Nadzbiór ISO-8859-1, którego jedyną różnicą jest zakres 0x80-0x9F: mieści tam 27 znaków drukowalnych, a 5 pozycji zostawia niezdefiniowanych. Przeglądarki sięgają po nie zawsze, gdy strona deklaruje ISO-8859-1.

CP437

8-bitowe, jeden bajt

Oryginalna strona kodowa IBM PC. Jej górna połowa to litery z akcentami, litery greckie i znaki ramek — właśnie takie tablice pojawiają się w artykułach obiecujących 256 znaków ASCII.

UTF-8

Zmienna długość, 1-4 bajty

Koduje cały Unicode, zachowując każdy bajt ASCII bajt w bajt bez zmian. Jest wstecznie zgodne z US-ASCII, ale z żadną z powyższych stron kodowych 8-bitowych już nie.

Przykłady

Tekst na kody dziesiętne

Hello
72 101 108 108 111

Każdy znak zamienia się w swój dziesiętny punkt kodowy. Wielkie litery zajmują zakres 65-90, małe 97-122 — dokładnie 32 dalej, i właśnie dlatego przestawienie bitu 5 zmienia wielkość litery.

Te same kody odczytane w dwóch systemach

41 42 43
hex -> ABC     decimal -> )*+

Właśnie dlatego konwerter nigdy nie zgaduje systemu za użytkownika. Oba odczyty są poprawne; tylko autor wpisu wie, o który mu chodziło.

Znaki sterujące przechodzą konwersję w obie strony bez strat

9 10 13 0
TAB, LF, CR, NUL

W polu wyniku są niewidoczne, więc wiersz podglądu pokazuje je jako znaki z unikodowego bloku Control Pictures. Przycisk kopiowania nadal kopiuje prawdziwe bajty, a nie ich zastępniki.

Bajty powyżej 127 są odrzucane, z wyjaśnieniem

233
Outside ASCII (0-127)

233 nie jest kodem ASCII. Narzędzie informuje, że ten bajt czyta się jako é zarówno w Windows-1252, jak i w ISO-8859-1, ale nie udaje, że to ASCII.

Jak korzystać

  1. 1

    Wybór systemu liczbowego

    Dziesiętny, szesnastkowy, ósemkowy albo dwójkowy. Ten krok jest pierwszy — te same cyfry dekodują się w każdym systemie inaczej, a narzędzie celowo nie zgaduje.

  2. 2

    Wpisywanie po dowolnej stronie

    Tekst po lewej, kody po prawej. Niezależnie od tego, które pole jest wypełniane, drugie aktualizuje się samo.

  3. 3

    Czytanie ostrzeżeń

    Znaki spoza zakresu 0-127 są wypisywane wraz z punktem kodowym i bajtami UTF-8, zamiast po cichu znikać albo zamieniać się w znaki zapytania.

  4. 4

    Tablica jako podręczna ściąga

    Można ograniczyć widok do znaków sterujących, przeszukać tablicę po kodzie lub nazwie i skopiować dowolny znak jednym kliknięciem.

Błędy, o których warto wiedzieć

Twierdzenie, że ASCII ma 256 znaków

ASCII kończy się na 127. Wszystko powyżej należy do konkretnej 8-bitowej strony kodowej, którą trzeba nazwać. Python powie to wprost, gdy poprosić go o zakodowanie znaku z akcentem jako ASCII.

✗ Niepoprawne
'cafe\u00e9'.encode('ascii')  # UnicodeEncodeError: ordinal not in range(128)
✓ Poprawne
'cafe\u00e9'.encode('utf-8')   # b'cafe\xc3\xa9'

Zakładanie, że każdy język ma te same sekwencje escape

JavaScript nie zna sekwencji \a. Zamiast zgłosić błąd, gubi odwrotny ukośnik i zostawia samą literę, a tryb ścisły w niczym nie pomaga.

✗ Niepoprawne
"\a".charCodeAt(0)   // 97 - that is the letter 'a', not BEL
✓ Poprawne
"\x07".charCodeAt(0) // 7 - BEL

Tłumaczenie notacji z daszkiem jako dodawania

Dodanie 0x40 działa dla zakresu C0 i psuje się przy DEL, gdzie trzeba by zamiast tego odejmować. XOR to jedna reguła obejmująca wszystkie 33 znaki.

✗ Niepoprawne
caret = chr(code + 0x40)   # 0x7F + 0x40 overflows past the table
✓ Poprawne
caret = chr(code ^ 0x40)   # 0x00 -> @, 0x1B -> [, 0x7F -> ?

Kiedy się przydaje

Czytanie zrzutu szesnastkowego albo śladu protokołu
Są bajty i trzeba wiedzieć, które z nich są drukowalne, które są separatorami, a które kodami sterującymi, na które terminal po cichu reaguje.
Diagnozowanie pliku, który zachowuje się dziwnie
Zabłąkany CR na końcu każdego wiersza, NUL, przez który grep uznaje plik za binarny, albo TAB tam, gdzie Makefile go wymagał.
Pisanie parsera albo walidatora
Decyzja, które zakresy bajtów przyjmować, i poprawne ustawienie granic — 0x21-0x7E dla znaków graficznych, 0x20 dla spacji, 0x7F dla DEL.
Wyjaśnianie błędu kodowania
Pokazanie koledze z zespołu, dlaczego ten sam bajt wyświetla się jako trzy różne znaki, zależnie od tego, jaką stronę kodową założył czytający program.

Szczegóły techniczne

ASCII, Unicode i UTF-8
Pierwsze 128 punktów kodowych Unicode, od U+0000 do U+007F, odpowiada ASCII jeden do jednego. UTF-8 koduje je jako pojedyncze bajty 0x00-0x7F z wyzerowanym najstarszym bitem. Naprawdę liczy się jednak trzecia własność: każdy bajt wielobajtowej sekwencji UTF-8 ma ustawiony najstarszy bit, więc bajt z zakresu 0-127 nigdy nie może być częścią znaku spoza ASCII. To właśnie dzięki temu można bezpiecznie przeszukiwać UTF-8 bajt po bajcie w poszukiwaniu /, \0 czy \n.
Ósmy bit
ASCII definiuje kod 7-bitowy; przechowywanie jednego znaku w 8-bitowym bajcie to konwencja, a historycznie ten zapasowy bit bywał bitem parzystości. Systemy pocztowe, które gwarantowały przezroczystość tylko dla 7 bitów, są powodem, dla którego istnieją Base64 i quoted-printable.
Dlaczego alfabet leży dokładnie tak, jak leży
Cyfry 0-9 siedzą pod 0x30-0x39, więc młodsza połówka bajtu to sama wartość. A to 0x41, a a to 0x61 — różnica jednego bitu, więc c | 0x20 zamienia na małą literę, a c & 0xDF na wielką. Ale tylko dla liter: '_' | 0x20 daje 0x7F, czyli DEL, a '[' | 0x20 daje {.
Warianty narodowe i problem 0x5C
ISO/IEC 646 pozwalała podmienić 12 punktów kodowych w każdym kraju. Japoński JIS X 0201 umieścił pod 0x5C symbol jena, a koreański KS X 1003 symbol wona — i dlatego japoński Windows pokazuje ścieżki z jenem, choć bajt nadal jest 0x5C. W Shift_JIS jest gorzej: drugi bajt znaku dwubajtowego sam może być równy 0x5C — kończą się nim znaki hyou, so, juu, nou, kou i bou, więc naiwna obsługa odwrotnego ukośnika przecina je na pół.

Jak zrobić to dobrze

Zawsze podawać nazwę strony kodowej
„Rozszerzone ASCII” nie mówi czytelnikowi nic. Trzeba napisać Windows-1252, ISO-8859-1 albo CP437 — ten sam bajt jest w każdym z nich innym znakiem.
Pisać US-ASCII, kiedy właśnie o to chodzi
To nazwa zarejestrowana w IANA. charset=ascii nią nie jest, a w przeglądarce charset=ISO-8859-1 da w praktyce Windows-1252, bo standard WHATWG Encoding właśnie tak przypisuje tę etykietę.
Nigdy nie zgadywać systemu liczbowego za użytkownika
Jeśli narzędzie albo parser po cichu uzna, że 41 jest zapisem szesnastkowym, pomyli się mniej więcej w połowie przypadków, a ta pomyłka będzie cicha.
Iterować po punktach kodowych, nie po jednostkach UTF-16
"A" + klucz wiolinowy + znak chiński ma .length === 4, choć znaki są trzy. Trzeba użyć [...str] albo codePointAt, inaczej komunikat o „nieobsługiwanym znaku” zgłosi emoji jako dwie ułomne połówki.

Najczęściej zadawane pytania

Ile znaków liczy ASCII?
128. ASCII to kod 7-bitowy, więc definiuje dokładnie punkty kodowe od 0 do 127: 32 znaki sterujące C0, 95 znaków graficznych łącznie ze spacją oraz DEL. Artykuły zatytułowane „pełna tablica ASCII (256 znaków)” pokazują jakąś konkretną 8-bitową stronę kodową — najczęściej CP437 albo Windows-1252 — a nie ASCII.
Czym jest rozszerzone ASCII?
Ściśle rzecz biorąc — niczym. „Rozszerzone ASCII” nie jest nazwą żadnego standardu; to potoczne określenie całej rodziny kodowań 8-bitowych, które zachowują zakres 0-127 bez zmian, a 128-255 definiują każde po swojemu. Bajt 0xE9 to é w ISO-8859-1, grecka litera Theta w CP437 i litera cyrylicy w CP866. Bez wskazania strony kodowej pytanie nie ma odpowiedzi.
Czy Windows-1252 to to samo co ISO-8859-1?
Od 0xA0 do 0xFF są identyczne, a od 0x80 do 0x9F całkowicie różne. ISO-8859-1 zostawia ten zakres niewidocznym znakom sterującym C1; Windows-1252 umieszcza tam 27 znaków drukowalnych — symbol euro, cudzysłowy typograficzne, półpauzę i pauzę — a 5 pozycji zostawia niezdefiniowanych. Dlatego cudzysłów typograficzny skopiowany z edytora tekstu zmienia się w niewidoczny znak sterujący, gdy przejdzie przez coś, co naprawdę jest ISO-8859-1.
Czy DEL jest znakiem sterującym?
Tak. Unicode zalicza U+007F do kategorii Cc, a iscntrl(127) w języku C zwraca prawdę. Po prostu nie należy do zbioru C0, który obejmuje ściśle 0x00-0x1F. Na końcu tablicy znalazł się przez taśmę perforowaną: 0x7F to siedem wybitych otworów, a raz wybitego otworu nie da się cofnąć, więc „wszystkie otwory wybite” było jedynym sposobem oznaczenia znaku jako skasowanego.
Czy spacja jest znakiem sterującym?
Nie, a sporo tablic ASCII podaje to błędnie. Unicode zalicza spację (0x20) do kategorii Zs, czyli separatorów odstępu, a te są znakami graficznymi. Znakami sterującymi są wyłącznie 0x00-0x1F oraz 0x7F.
Skoro ASCII jest 7-bitowe, dlaczego kolumna dwójkowa pokazuje 8 bitów?
Bo to bajt jest jednostką, w której wszystko naprawdę się przechowuje — najstarszy bit jest po prostu zawsze zerem. To dopełnienie nie jest ozdobą: właśnie dlatego, że ASCII nigdy nie używa ósmego bitu, UTF-8 mógł zająć go jako znacznik „to część sekwencji wielobajtowej”, i to właśnie czyni UTF-8 wstecznie zgodnym z ASCII.
Czy każdy język zapisuje znaki sterujące tak samo?
Nie, a różnice potrafią zaboleć. \a (dzwonek) jest standardem w C i w Pythonie, ale JavaScript takiej sekwencji nie ma — '\a' po cichu staje się literą a, bez żadnego błędu, nawet w trybie ścisłym. Java odrzuca zarówno \a, jak i \v. Go odrzuca \0, bo tamtejsze sekwencje ósemkowe muszą mieć dokładnie trzy cyfry, więc pisze się \000. A \e oznaczające ESC to rozszerzenie GNU, a nie standard ISO C.
Co oznacza ^M w diffie albo w vimie?
To powrót karetki, bajt 13. Notacja z daszkiem zapisuje znak sterujący, wykonując XOR jego wartości z 0x40, więc CR (0x0D) staje się ^M, a ESC (0x1B) staje się ^[. ^M na końcu każdego wiersza oznacza, że plik ma windowsowe końce wierszy CRLF; komunikat bad interpreter: /bin/bash^M oznacza, że złapał je skrypt powłoki.

Powiązane narzędzia

Zobacz wszystkie narzędzia →