ASCII-Tabelle
Vollständige Referenz aller 128 ASCII-Zeichen mit Dezimal-, Hex-, Oktal- und Binärcodes.
128 Zeichen angezeigt
Über ASCII
ASCII (American Standard Code for Information Interchange) ist ein 7-Bit-Zeichenkodierungs-Standard, der 128 Zeichen definiert. Er wurde erstmals 1963 veröffentlicht und ist die Grundlage der meisten modernen Zeichenkodierungen einschließlich UTF-8.
Zeichenbereiche
- 0–31 · Steuerzeichen (nicht druckbar)
- 32 · Leerzeichen
- 33–47 · Interpunktion und Symbole
- 48–57 · Ziffern 0–9
- 65–90 · Großbuchstaben A–Z
- 97–122 · Kleinbuchstaben a–z
- 127 · DEL (Löschen)
Was ist der Unterschied zwischen ASCII und Unicode?
ASCII definiert 128 Zeichen mit 7 Bits. Unicode ist eine Obermenge, die über 149.000 Zeichen aus allen Schriftsystemen abdeckt. Die ersten 128 Unicode-Code-Punkte sind identisch mit ASCII.
Wie verwende ich diese Codes in der Programmierung?
In JavaScript: String.fromCharCode(65) → „A". In Python: chr(65). In C: (char)65. Die Hex-Werte funktionieren mit Escape-Sequenzen: \x41 = „A".
So funktioniert es
- Die vollständige Tabelle durchsuchen: Alle 128 ASCII-Zeichen erscheinen in einem nach Codepunkt sortierten Raster (0 bis 127). Jede Zelle zeigt das sichtbare Zeichen (oder seine Abkürzung bei Steuerzeichen), den Dezimalcode und die Hex-/Oktal-/Binär-Entsprechungen.
- Nach Kategorie filtern: Verwenden Sie das Dropdown-Menü, um auf Steuerzeichen (0-31), druckbare Zeichen (32-126), Buchstaben, Ziffern oder Symbole einzugrenzen. Nützlich, wenn Sie sich nur etwa für den Interpunktionsblock interessieren.
- Suche: Das Suchfeld findet anhand des Zeichennamens ("LF"), der Abkürzung oder des Zahlenwerts (dezimal oder hex). Die Eingabe von
0x41,65oderAspringt jeweils zur selben Zelle. - Klicken Sie auf eine Zelle, um eine ihrer Darstellungen in die Zwischenablage zu kopieren. Praktisch, wenn Sie
\x1Bfür einen ANSI-Escape,0x0Afür einen Unix-Zeilenumbruch oder die Dezimalzahl32für ein Leerzeichen brauchen.
Eine kurze Geschichte von ASCII
ASCII (American Standard Code for Information Interchange) wurde vom IBM-Ingenieur Bob Bemer im Mai 1961 dem Unterausschuss X3.2 der American Standards Association vorgeschlagen, mit dem Ziel, das Dutzend damals gebräuchlicher inkompatibler Zeichencodes zu ersetzen. Die erste veröffentlichte Ausgabe war ASA X3.4-1963; Kleinbuchstaben kamen erst mit der Revision von 1967. Der Standard wurde seither mehrfach unter dem Namen ANSI X3.4-1986 bestätigt und bildet durch seinen internationalen Zwilling ISO/IEC 646 (und das europäische ECMA-6) die Grundlage jeder modernen Zeichencodierung.
Für den Netzwerkgebrauch wurde ASCII durch RFC 20, "ASCII format for Network Interchange", kodifiziert, veröffentlicht am 16. Oktober 1969 und verfasst von Vint Cerf an der UCLA. Die Empfehlung des RFC ("7-Bit-ASCII, eingebettet in ein 8-Bit-Byte, dessen höchstwertiges Bit immer 0 ist") ist bis heute die Art, wie jede moderne Programmiersprache und jedes Protokoll über Klartext denkt. Die US-Bundesregierung schrieb per Anordnung von Präsident Lyndon B. Johnson 1968 die ASCII-Unterstützung auf allen Bundescomputern ab dem 1. Juli 1969 vor, was die branchenweite Übernahme sicherstellte.
Warum sieben Bit?
Das X3.2-Komitee saß zwischen zwei unattraktiven Optionen fest. Ein 6-Bit-Code (verwendet von älteren Telegrafenalphabeten wie ITA2) war unzuverlässig: Ein einziger Bit-Kipper auf einer rauschenden Leitung konnte jedes folgende Zeichen falsch decodieren, wenn er auf ein Shift-Bit fiel. Ein 8-Bit-Code schien in einer Zeit teuren Speichers und langsamer Modems verschwenderisch. Der Kompromiss waren 7 Bit = 128 Codepunkte, womit das 8. Bit für die Parität frei blieb. Das Setzen des Paritätsbits, sodass jedes Byte eine gerade (oder ungerade) Gesamtzahl von 1-Bits hatte, fing 100 % der Einzelbit-Übertragungsfehler ab, genau das Problem, das akustische Koppler und serielle Kabel der 1960er-Jahre erzeugten.
Als die Fehlerraten sanken und Modems schneller wurden, wurde das 8. Bit umgewidmet. Verschiedene nationale "Extended-ASCII"-Codepages (Latin-1, Windows-1252, Mac Roman, KOI8-R, …) verwendeten die Codes 128-255 für Buchstaben mit Akzent und Rahmenzeichen, aber diese Zuordnungen waren untereinander inkompatibel und wurden schließlich von Unicode und UTF-8 verdrängt.
Das Layout: 128 Codepunkte
7 Bit = 27 = 128 verschiedene Codes, gegliedert in 33 Steuerzeichen (0-31 plus DEL bei 127) und 95 druckbare Zeichen (32-126):
| Bereich | Hex | Inhalt |
|---|---|---|
| 0-31 | 00-1F | Steuerzeichen (NUL, BEL, BS, HT, LF, CR, ESC, FS-US, …) |
| 32 | 20 | SPACE, druckbar, aber unsichtbar |
| 33-47 | 21-2F | Interpunktion: ! " # $ % & ' ( ) * + , - . / |
| 48-57 | 30-39 | Ziffern 0-9 |
| 58-64 | 3A-40 | Mehr Interpunktion: : ; < = > ? @ |
| 65-90 | 41-5A | Großbuchstaben A-Z |
| 91-96 | 5B-60 | Klammern und Akzente: [ \ ] ^ _ ` |
| 97-122 | 61-7A | Kleinbuchstaben a-z |
| 123-126 | 7B-7E | Geschweifte Klammern und Tilde: { | } ~ |
| 127 | 7F | DEL, "rub out" auf gelochtem Papierstreifen (binär 1111111) |
Steuerzeichen, die noch von Bedeutung sind
Die meisten der 33 Steuerzeichen entstanden als Fernschreiber- und Lochstreifen-Befehle und sind heute historische Kuriositäten. Eine Handvoll ist im alltäglichen Rechnen noch tragend:
- NUL (0x00): beendet Strings in C und jeder von C abgeleiteten Sprache. Ein eingebettetes Null in einen Dateipfad einzufügen, ist ein klassischer Weg, alten Code zum Absturz zu bringen.
- BEL (0x07,
\a): der Terminal-Piepton. Wird noch durchprintf '\a'ausgelöst. - BS (0x08,
\b): Rückschritt. Wird von Fortschrittsbalken-Bibliotheken verwendet, um die vorherige Zeile zu überschreiben. - HT (0x09,
\t): horizontaler Tabulator. Definiert das Tabulatorzeichen, das in TSV-Dateien und in der ewigen Einrückungsdebatte des Python-Interpreters verwendet wird. - LF (0x0A,
\n): Zeilenvorschub. Der Unix-Zeilenumbruch. - CR (0x0D,
\r): Wagenrücklauf. Die Hälfte des Windows-Zeilenumbruchs; allein verwendet für "zurück zum Zeilenanfang" in Fortschrittsbalken. - ESC (0x1B,
\e/\x1B): das Escape-Zeichen. Bemers ursprüngliche Erfindung, heute das Präfix für jede ANSI-Terminal-Escape-Sequenz (Farben, Cursorbewegung, Bildschirm löschen). - FS / GS / RS / US (0x1C-0x1F): File-/Group-/Record-/Unit-Separatoren. Für datensatzorientierte Bandspeicherung in den 1960er-Jahren entworfen und weitgehend vergessen, bis RFC 7464 "JSON Text Sequences" RS als Präfix-Trennzeichen für gestreamte JSON-Datensätze (
application/json-seq) zurückbrachte. GS taucht noch in einigen Barcode-Protokollen des Einzelhandels auf. - DEL (0x7F): "rub out." Die RUB-OUT-Taste des Teletype Model 33 sendete den Code 127, weil er binär
1111111ist: alle sieben Bit gesetzt. Um ein Zeichen auf dem Papierstreifen zu löschen, spulte der Bediener den Streifen zurück und drückte RUB OUT, wodurch jedes vorhandene Loch durchstanzt wurde. Der Empfänger sollte jedes Byte ignorieren, das nur aus 1en bestand.
Die Zeilenende-Kriege
Drei Plattformen wählten drei verschiedene Konventionen, und die Software zahlt seitdem dafür. Der mechanische Ursprung ist die Schreibmaschine und der Fernschreiber, wo zwei separate Aktionen nötig waren: Wagenrücklauf bewegte den Druckkopf zurück zur Spalte 1, und Zeilenvorschub schob das Papier um eine Zeile vor. Verschiedene Systeme trafen unterschiedliche Entscheidungen darüber, ob dies als ein Byte oder zwei codiert werden sollte:
| Betriebssystem | Zeilenumbruch | Bytes | Escape |
|---|---|---|---|
| Unix / Linux / modernes macOS | LF | 0x0A | \n |
| Klassisches Mac OS (vor OS X) | CR | 0x0D | \r |
| Windows / DOS | CRLF | 0x0D 0x0A | \r\n |
Internetprotokolle schreiben meist CRLF vor: HTTP, SMTP, FTP, MIME und das standardmäßige Internet Message Format geben es alle an. RFC 5322 ist eindeutig: "CR und LF DÜRFEN nur zusammen als CRLF vorkommen; sie DÜRFEN NICHT unabhängig erscheinen" im Nachrichtentext. Innerhalb von Quellcode variiert die Konvention jedoch je nach Team, weshalb git core.autocrlf mitliefert: Mit true unter Windows checkt git Dateien im Arbeitsverzeichnis als CRLF aus, speichert sie aber als LF im Repository, sodass dieselbe Quelldatei auf jeder Plattform denselben Blob-Hash erzeugt. Ein .gitattributes-Eintrag wie * text=auto ist die projektweite Alternative.
ANSI-Escape-Sequenzen für Terminalfarbe
Das Escape-Zeichen (ESC, 0x1B) ist das Präfix für die ANSI-Escape-Sequenzen, die die Terminalausgabe einfärben. Der Standard ist ECMA-48 (1976), später als ANSI X3.64 gespiegelt und in ISO/IEC 6429 eingearbeitet. Die Grammatik ist ESC [ + Parameter + ein abschließender Buchstabe; der Teil ESC [ heißt Control Sequence Introducer (CSI) und wird je nach Sprache verschieden als \e[, \x1b[ oder \033[ geschrieben. Häufige Select-Graphic-Rendition-Codes:
0: zurücksetzen / normal ·1: fett ·4: unterstrichen ·7: invertiert30-37: Vordergrundfarbe (schwarz, rot, grün, gelb, blau, magenta, cyan, weiß)40-47: Hintergrundfarbe (gleiche Reihenfolge)90-97/100-107: heller Vordergrund / Hintergrund
So gibt printf '\033[1;31mERROR\033[0m' "ERROR" in fettem Rot aus und setzt danach zurück. Jeder moderne Terminal-Emulator (und das Windows Terminal seit 2019) unterstützt diese.
ASCII vs. Unicode und UTF-8
ASCII definiert 128 Codepunkte; Unicode 16.0 (veröffentlicht 2024) deckt mehr als 154.000 ab. Die entscheidende Brücke ist UTF-8, die dominierende Textcodierung im Web (2026 von ~98 % der Websites verwendet): UTF-8 ist so konzipiert, dass jedes 7-Bit-ASCII-Byte (0x00-0x7F) dasselbe Zeichen codiert, das es immer tat, mit gelöschtem höchstwertigem Bit. Die praktische Folge ist, dass jede gültige ASCII-Datei auch eine gültige UTF-8-Datei ist, Byte für Byte identisch. Codepunkte über 127 werden als Mehrbyte-Sequenzen (2 bis 4 Bytes) mit gesetztem höchstwertigem Bit auf jedem Byte codiert, was garantiert, dass ältere ASCII-Parser sie nie mit ASCII-Zeichen verwechseln.
ASCII in gängigen Programmiersprachen
| Sprache | Code → Zeichen | Zeichen → Code |
|---|---|---|
| JavaScript | String.fromCharCode(65) | 'A'.charCodeAt(0) |
| Python | chr(65) | ord('A') |
| C / C++ | (char)65 | (int)'A' |
| Java | (char) 65 | (int) 'A' |
| Rust | char::from(65) | 'A' as u32 |
| Go | string(rune(65)) | int('A') |
| Bash / sh | printf '\x41' | printf '%d' "'A" |
| HTML | A oder A | - |
| URL-Codierung | %41 = "A", %20 = Leerzeichen | - |
Der Trick mit dem Groß-/Kleinschreibungs-Bit
Eine kleine, aber elegante Eigenschaft des ASCII-Layouts: Ein Großbuchstabe und sein Kleinbuchstaben-Gegenstück unterscheiden sich in genau einem Bit. A ist 65 = 0100 0001; a ist 97 = 0110 0001. Nur Bit 5 unterscheidet sich. Das macht einen Vergleich ohne Beachtung der Groß-/Kleinschreibung zu einer einzigen bitweisen Operation, x | 0x20 erzwingt Kleinschreibung, x & 0xDF erzwingt Großschreibung, beide schneller als eine Nachschlagetabelle. Das war eine bewusste Entwurfsentscheidung in der Revision von 1967 und ist ein Grund, warum das Layout an manchen Stellen "zufällig" aussieht: Es codiert hardwarefreundliche Eigenschaften, nicht nur die alphabetische Reihenfolge.
Häufige Fallstricke
- Die Ziffer 0 mit dem Steuerzeichen NUL verwechseln. NUL ist Code 0; das Zeichen "0" ist Code 48. Die beiden sind in keiner Programmiersprache austauschbar.
- Annehmen, ein Byte sei ein Zeichen. Nur für ASCII-Text wahr. UTF-8-Text hat Zeichen variabler Breite, sodass Bytelänge und Zeichenanzahl bei nichtlateinischen Schriften stark voneinander abweichen können.
- Zeilenenden innerhalb einer Datei mischen. Gemischte CR / LF / CRLF in derselben Datei verwirren viele Parser und erzeugen je nach öffnendem Betriebssystem Phantom-Leerzeilen oder fehlende Zeilenumbrüche.
- Off-by-one beim Beenden von C-Strings. Zu vergessen, dass Strings ein zusätzliches Byte für das abschließende NUL brauchen, ist die ursprüngliche Pufferüberlauf-Schwachstelle.
- "Extended ASCII" als portabel angenommen. Die Codes 128-255 bedeuten unter Latin-1, Windows-1252, KOI8-R, Mac Roman usw. unterschiedliche Zeichen. UTF-8 ist die einzige sichere moderne Wahl.
- Eingebettetes ESC in nicht vertrauenswürdiger Eingabe. Wenn Sie von Nutzern gelieferte Daten ohne Bereinigung in ein Terminal protokollieren, kann ein Angreifer ANSI-Escape-Sequenzen einschleusen, die die Farbe ändern, den Cursor bewegen oder den Bildschirm löschen, manchmal unter Verbergen bösartiger Inhalte.
Häufig gestellte Fragen
Warum hat DEL den Code 127 statt 0?
Weil 127 binär 1111111 ist: alle sieben Bit gesetzt. Um ein Zeichen auf gelochtem Papierstreifen zu löschen, spulte der Bediener den Streifen zurück und drückte RUB OUT, wodurch jedes vorhandene Loch durchstanzt wurde. Der Empfänger sollte jedes Byte ignorieren, das nur aus 1en bestand, sodass das "gelöschte" Zeichen bei späteren Lesevorgängen unsichtbar wurde. Die Konvention wurde von früheren Fernschreibercodes übernommen.
Was ist "Extended ASCII" und ist seine Verwendung sicher?
Standard-ASCII deckt die Codepunkte 0-127 ab (7 Bit). "Extended ASCII" bezeichnet lose 8-Bit-Codierungen, die die Codepunkte 128-255 mit zusätzlichen Zeichen füllen, Latin-1, Windows-1252, KOI8-R, Mac Roman und viele andere. Der Haken: Die zusätzlichen Zeichen bedeuten in jeder Codierung etwas anderes. Der Name ist technisch eine Fehlbezeichnung (diese Codepages sind keine Erweiterungen des ASCII-Standards), und sie sind über Systeme hinweg nicht sicher. UTF-8 ist der moderne, portable Ersatz und ist rückwärtskompatibel mit dem ursprünglichen Bereich 0-127.
Warum gilt das Leerzeichen (32) als "druckbar", wenn es nichts anzeigt?
Weil es horizontalen Platz auf einer gedruckten Zeile einnimmt, es rückt den Druckkopf genau so vor, wie es ein Buchstabe tut. Steuerzeichen ändern dagegen den Gerätezustand, ohne sichtbare Ausgabe zu erzeugen (BEL piept, BS bewegt den Kopf rückwärts, LF schiebt das Papier vor). Die Klassifizierung beruht darauf, was das Zeichen auf einem Drucker tut, nicht darauf, ob es eine Glyphe hat.
Sind CR und LF dasselbe wie Enter auf meiner Tastatur?
Meistens ja, aber das Byte, das Ihre Tastatur erzeugt, hängt vom Betriebssystem ab. Unter Windows erzeugt das Drücken von Enter typischerweise CRLF (0x0D 0x0A); unter Linux und modernem macOS nur LF (0x0A); unter klassischem Mac OS vor X nur CR (0x0D). Viele Editoren normalisieren dies beim Speichern anhand der vorhandenen Zeilenenden der Datei oder der konfigurierten Projektkonvention.
Warum sind die File-/Group-/Record-/Unit-Separatoren hier enthalten?
Sie wurden für datensatzorientierte Bandspeicherung in den 1960er-Jahren entworfen, File > Group > Record > Unit. Sie kamen größtenteils außer Gebrauch, sind aber an zwei überraschenden Stellen zurückgekehrt: RFC 7464 "JSON Text Sequences" (Medientyp application/json-seq) verwendet RS (0x1E) als Präfix, um gestreamte JSON-Datensätze abzugrenzen, und der GS1-Application-Identifier-Separator in Barcode-Protokollen des Einzelhandels verwendet GS (0x1D).
Ist ASCII 2026 noch relevant?
Sehr. Jedes moderne Protokoll, das "textbasiert" ist (HTTP-Header, JSON, YAML, Quellcode, Kommandozeilenargumente, Umgebungsvariablen, DNS-Hostnamen), arbeitet innerhalb des ASCII-Bereichs. UTF-8 ist die dominierende Codierung für beliebigen Text, aber UTF-8s erste 128 Bytewerte sind genau ASCII, Byte für Byte. Die Tabelle zu kennen, ist nach wie vor erforderlich für alles von der URL-Codierung über Terminalfarben bis zum Debuggen von Textcodierungsfehlern.