Why ASCII stops at 127
ASCII (American Standard Code for Information Interchange) was standardized in the 1960s as a 7-bit code — each character represented by a number from 0 to 127, fitting in 7 bits with one bit historically left over for parity checking on early serial links. That 7-bit ceiling wasn't an oversight; it was the deliberate scope of the standard. Every value above 127 needs an eighth bit, and what that eighth bit means was never part of ASCII itself — it was left to whatever encoding a particular manufacturer, operating system, or country's standards body decided to define on top of it.
The three blocks within 0–127
The standard range splits cleanly into three sections. Codes 0–31, plus 127, are control characters — codes that were never meant to be printed or displayed, but to instruct a teletype, terminal, or modem to do something: ring a bell (BEL, 7), move to a new line (LF, 10), signal end-of-transmission (EOT, 4), or delete the previous character (DEL, 127). Most of these trace back to physical teletype hardware from the 1960s and 70s and have no visual glyph at all, which is why this table shows their abbreviation instead of a character. Code 32 is the space character — technically printable but invisible. Codes 33 through 126 are the familiar printable set: digits, uppercase and lowercase Latin letters, and punctuation.
Why the layout isn't arbitrary
ASCII's numbering has structure built into it that makes certain operations trivial. Digits 0–9 occupy a contiguous block (48–57), so subtracting 48 from a digit character's code gives its numeric value directly. Uppercase letters (65–90) and lowercase letters (97–122) are each contiguous too, and the gap between a letter's uppercase and lowercase code is always exactly 32 — one bit — which is why toggling that single bit is a common trick for case conversion at the bit level. This deliberate layout is also why the hex column repeats useful patterns: every uppercase letter's hex value starts with 4 or 5, and every lowercase letter's starts with 6 or 7, differing by exactly 0x20.
What "extended ASCII" actually means
There is no single official "extended ASCII" standard — the phrase is a catch-all for any 8-bit encoding that keeps standard ASCII in positions 0–127 and adds something else in 128–255. ISO-8859-1 (Latin-1), shown in the second table above, was one of the most widely adopted choices, covering Western European accented characters and symbols. Windows-1252, Microsoft's variant, is nearly identical but repurposes positions 128–159 — which Latin-1 leaves as obscure C1 control codes — for printable characters like curly quotes, an em dash, and the euro sign, which is why text copied from older Windows software sometimes displays "smart quotes" or a stray "€" incorrectly on a system expecting strict Latin-1. Other regions standardized entirely different 8-bit code pages for the same range, which is precisely the ambiguity Unicode and UTF-8 were designed to eliminate.
ASCII's relationship to Unicode and UTF-8
ASCII didn't get replaced so much as absorbed. Unicode assigns the exact same 128 code points to the exact same characters as ASCII, and UTF-8 — the encoding that now carries most of the text on the internet — represents those first 128 code points as a single byte identical to classic ASCII. A plain ASCII text file is already valid UTF-8, byte for byte, with no conversion needed. The difference only shows up once a code point exceeds 127: UTF-8 then switches to a variable-length, self-describing multi-byte sequence, covering the rest of Unicode's far larger range instead of a single fixed 8-bit extension. TheHex ↔ UTF-8 tool covers that multi-byte behavior directly.
Reading the columns
Decimal is the code point's plain numeric value. Hex is that same value in base 16, the form most commonly seen in source code and documentation (0x41 for capital A). Octal (base 8) is included mainly because some older Unix tools and escape-sequence conventions (like\101 for capital A in a C string literal) still use it. Binary shows the raw 8-bit pattern, useful when reasoning about bitwise operations or serial protocols directly.