Skip to content
T
Tools.Town
Free Online Tools for Everyone
Text Tools

The ASCII Table Explained: History, Code Points, and Why It Still Matters

Everything you need to know about the ASCII character table — its history at Bell Labs, the 128 code points, control characters, extended ASCII, and the transition to Unicode.

25 June 2026 4 min read By Tools.Town Team Fact Checked

Key Takeaways

  • ASCII defines exactly 128 characters, numbered 0 through 127
  • You may be thinking of lowercase a, which is code point 97
  • No
  • Constantly

Where ASCII came from

In the early 1960s, computers and telecommunications equipment were growing rapidly but communicating poorly. Teletypes from different manufacturers used different codes. IBM’s punched-card systems used EBCDIC (Extended Binary Coded Decimal Interchange Code), which bore almost no resemblance to the codes used by the Bell System for telephone networks. Messages transmitted between incompatible machines required human translation or purpose-built converters.

The American Standards Association (now ANSI) formed the X3.2 committee in 1960 specifically to address this problem. Bell Labs engineers played a central role in the design, as did IBM and the major teletype manufacturers. The first published version of the American Standard Code for Information Interchange appeared in 1963, and the version most people refer to today was standardized as ANSI X3.4 in 1968 and later as ISO 646.

The design committee made choices that still echo through computing more than sixty years later. They placed the uppercase alphabet starting at code point 65 (decimal) and the lowercase alphabet at 97, exactly 32 apart. This meant that bit 5 — counting from zero — distinguished case, and a simple OR or AND operation with the value 32 could convert between uppercase and lowercase without any lookup table. They placed the digits 0 through 9 at code points 48 through 57, which meant subtracting 48 from the ASCII value of a digit character gave you the numeric value directly.

The 128 code points in detail

ASCII uses seven bits to define 128 positions. The positions break cleanly into two groups: the 33 control characters occupying positions 0 through 31 plus position 127, and the 95 printable characters occupying positions 32 through 126.

The 95 printable characters include the space character at position 32, which is often overlooked in discussions of printable ASCII but is technically a printable character — it represents the absence of a glyph. Following the space are the punctuation and symbol characters from 33 through 47 (including the exclamation mark, double quote, hash, dollar sign, percent, ampersand, and others), then the digit characters 0 through 9 at positions 48 through 57, more punctuation from 58 through 64 (colon, semicolon, less-than, equals, greater-than, question mark, and at-sign), uppercase letters A through Z at positions 65 through 90, more punctuation from 91 through 96 (square brackets, backslash, caret, underscore, and backtick), lowercase letters a through z at positions 97 through 122, and a final cluster of four characters from 123 through 126 (opening curly brace, vertical bar, closing curly brace, and tilde). Position 127 is the DEL (delete) control character.

You can see the full binary representation of any of these characters using Text to Binary, which shows you the exact bit pattern for each character in ASCII mode.

Control characters and their legacy

The 33 control characters (positions 0–31 and 127) are often treated as obscure relics, but several of them are in constant everyday use. The null character (NUL, position 0) terminates strings in C and C-family languages and fills the buffers of many file formats. The tab character (HT, position 9) structures indented code and CSV-adjacent text formats. The line feed (LF, position 10) marks end-of-line on Unix and Linux systems and in all modern internet protocols. The carriage return (CR, position 13) was originally a teletype instruction to return the print head to the start of the line without advancing to the next one. Windows uses the two-character sequence CR LF for line endings, a tradition inherited from the days when both movements were needed to produce a new line on a physical printer.

The escape character (ESC, position 27) begins control sequences in ANSI terminal emulators. When you see text colorized in a terminal, the colors are produced by sequences like ESC [ 3 1 m (which sets the foreground to red). These ANSI escape codes, standardized by ECMA-48, are built entirely on the ASCII ESC byte and printable characters that follow it.

The BEL character (position 7) originally rang a physical bell on a teletype to alert the operator. In modern terminals it produces a beep or a visual flash. The ETX character (position 3) — end of text — is what you send when you press Ctrl+C in a Unix terminal to interrupt a running process. The EOT character (position 4) — end of transmission — is what Ctrl+D sends, which signals end-of-file on standard input. Understanding these mappings demystifies a lot of terminal behavior that seems magical to newcomers.

Why ASCII is still the backbone of the internet

Despite being defined in 1963, ASCII is not a historical curiosity. The structural tokens of virtually every protocol that powers the internet are defined in ASCII. HTTP request lines, response headers, method names (GET, POST, PUT, DELETE), and status codes are all ASCII. Email headers and the SMTP protocol are ASCII. DNS names are ASCII (with the Punycode extension for internationalized domain names). JSON is defined as UTF-8 but the structural tokens — curly braces, square brackets, colons, commas, and quotation marks — are all ASCII. XML is the same. HTML. CSS property names. JavaScript identifiers. Python keywords. Every programming language in common use today has a grammar defined entirely in ASCII, even if the language supports Unicode identifiers and string content.

This pervasive dependency on ASCII exists partly for historical inertia but also because ASCII has a property that makes it robust: it is a true subset of UTF-8. Any byte in the range 0–127 in a UTF-8 stream unambiguously represents the corresponding ASCII character. There is no ambiguity, no escape sequence, no state machine needed. This means a UTF-8 parser can scan for ASCII structural tokens — the {'{'} of a JSON object, the newline ending an HTTP header — without decoding the surrounding Unicode content at all.

Extended ASCII and the code page era

The 7-bit design of ASCII left the eighth bit of an 8-bit byte unused. As 8-bit bytes became universal, vendors rushed to use that eighth bit for additional characters. The 128 new positions (128 through 255) were filled in different ways by different vendors and standards bodies, producing a proliferation of incompatible “extended ASCII” encodings.

IBM’s Code Page 437 — used in the original IBM PC — filled the upper 128 positions with line-drawing characters (single and double lines in horizontal, vertical, and corner variants), mathematical symbols, Greek letters, and a handful of accented Latin characters. These line-drawing characters were used to create text-mode user interfaces and are still occasionally seen in command-line applications. This code page is also the reason the IBM PC could display the card suits ♠ ♣ ♥ ♦ on screen in the 1980s.

Microsoft’s Windows-1252, often called the ANSI code page, replaced the IBM line-drawing characters with accented characters for Western European languages. It became the dominant encoding for Windows documents, web pages, and email in the 1990s and early 2000s. The em dash, left and right quotation marks, ellipsis, and various other typographic symbols common in word processor output live in the Windows-1252 range from 128 to 159, a range that ISO 8859-1 (Latin-1) leaves undefined. This is why text that looks fine on a Windows system sometimes displays as question marks or garbled characters when opened on a Mac or Linux system — the bytes in that range have different meanings, or no defined meaning at all, in other encodings.

The ISO 8859 series attempted to bring order to the situation. ISO 8859-1 (Latin-1) covers Western European languages. ISO 8859-2 covers Central European languages. ISO 8859-5 covers Cyrillic. ISO 8859-8 covers Hebrew. Each variant kept the 0–127 range identical to ASCII and defined a different set of characters for 160–255 (128–159 were left as control characters in the ISO standard, unlike Windows-1252 which put printable characters there). But with a dozen incompatible ISO 8859 encodings and at least as many code pages from various vendors, the situation remained chaotic. A document from Turkey encoded in ISO 8859-9 would display completely differently when opened under ISO 8859-5.

The transition to Unicode

The Unicode Consortium was formed in 1987 to create a single character encoding that could represent every character in every writing system. Version 1.0 of the Unicode Standard was published in 1991. The design was deliberately backwards-compatible with ASCII: the first 128 Unicode code points (U+0000 through U+007F) are identical to ASCII. The next 128 (U+0080 through U+00FF) are identical to Latin-1. This meant existing ASCII and Latin-1 content could be migrated to Unicode with minimal change.

Unicode also specified several encodings for storing code points as bytes. UTF-16 uses two bytes per code point for the most common characters. UTF-32 uses four bytes for every code point. UTF-8, proposed by Ken Thompson and Rob Pike in 1992, uses one byte for ASCII characters and two to four bytes for everything else. UTF-8’s backwards compatibility with ASCII made it the natural choice for internet protocols and file systems, and it has become the dominant encoding on the web.

The practical implication for anyone working with text today is straightforward: ASCII knowledge remains essential because the structural layer of everything from source code to network protocols is ASCII. But for any content that might contain accented characters, symbols, or any non-Latin script, UTF-8 (and Unicode more broadly) is the correct choice. The code page era is over — UTF-8 has won.

To explore how any letter, symbol, or punctuation mark maps to its binary representation under ASCII or UTF-8, try the Text to Binary tool. It shows you the exact bits for each character so you can see the design patterns described in this guide first-hand. For more about how modern text tools work with character counts and string lengths, see the Character Counter guide.

Advertisement

Try Text to Binary — Free

Apply what you just learned with our free tool. No sign-up required.

Try Text to Binary

Frequently Asked Questions

How many characters does ASCII define?
ASCII defines exactly 128 characters, numbered 0 through 127. Of these, 95 are printable (letters, digits, punctuation, and the space character) and 33 are non-printing control characters inherited from teleprinter conventions.
Why does uppercase A start at 97 in some tables I see?
You may be thinking of lowercase a, which is code point 97. Uppercase A is 65. The 32-point gap between them is a deliberate design choice — toggling bit 5 of an ASCII code converts between uppercase and lowercase, which simplified early text processing hardware.
Is extended ASCII a real standard?
No. 'Extended ASCII' is an informal umbrella term for any 8-bit encoding that uses the upper 128 slots (128–255) beyond standard ASCII. IBM Code Page 437, Windows-1252, ISO 8859-1, and dozens of others are all called 'extended ASCII' but are mutually incompatible. Only the base 0–127 range is truly standardized.
Is ASCII still used today?
Constantly. Source code, configuration files, HTTP headers, DNS names, email headers, JSON keys, and the structural tokens of virtually every protocol on the internet are ASCII. UTF-8 is a superset of ASCII for the first 128 code points, so any ASCII content is automatically valid UTF-8.

Was this guide helpful?

Your feedback helps us improve our content.

Continue Reading

All Text Tools Guides

Get the best Text Tools tips & guides in your inbox

Join 25,000+ users who get our weekly text tools insights.