Eine Zeichenkette, Zeichenfolge, Zeichenreihe oder ein (aus dem Englischen) ist in der Informatik eine endliche Folge von Zeichen (z. B. Buchstaben, Ziffern, Sonderzeichen und Steuerzeichen) aus einem definierten Zeichensatz. Zeichen können sich in einer Zeichenkette wiederholen, die Reihenfolge der Zeichen ist definiert. Eine Zeichenkette kann auch leer sein, also kein Zeichen enthalten und die Länge 0 haben. Zeichenketten sind somit Sequenzen aus Symbolen mit endlicher Länge.

In der Programmierung ist eine Zeichenkette ein Datentyp, der eine Kette von Zeichen mit fester oder variabler Länge enthält. Damit werden hauptsächlich Wörter, Sätze und ganze Texte gespeichert. Fast jede Programmiersprache besitzt einen derartigen Datentyp und manche Programmiersprachen arbeiten ausschließlich mit diesem Datentyp. Beispiele dafür sind sed, awk und bash. Im Quelltext eines Computerprogramms stellen Zeichenketten Text dar, der nicht als Programmierbefehl aufgefasst wird, sondern Information enthält. So können zum Beispiel Fehlermeldungen oder andere Ausgaben an den Benutzer als Zeichenkette im Quelltext festgehalten werden oder Benutzereingaben als Zeichenketten in Variablen abgespeichert werden.

Die Grundlagen von Programmiersprachen werden in der Theoretischen Informatik untersucht. Dort wird der gegebene Zeichensatz als Alphabet bezeichnet und die Zeichenketten werden „Wörter“ genannt. Die Theorie solcher Wörter sind ein Thema der formalen Sprachen. Im Zusammenhang mit Programmiersprachen stellen sich dagegen Fragen der Darstellung, der Speicherung und des Umgangs mit Zeichenketten.

Repräsentation Zeichenketten können auf verschiedenen Ebenen repräsentiert werden. Eine davon ist der Quelltext eines Programms, der vom Übersetzer gelesen und interpretiert wird. Eine andere ist, wie eine Zeichenkette zur Laufzeit eines Programms im Speicher abgelegt wird.

Syntax für Literale In nahezu allen Programmier- und Auszeichnungssprachen, die Zeichenketten-Literale unterstützen, wird eine literale Zeichenkette durch das einfache Aneinanderfügen von Zeichen zwischen einfachen oder doppelten Anführungsstriche repräsentiert:

"Wikipedia" 'Wikipedia.' "123" (in den allermeisten Sprachen verschieden von der Zahl 123). "" (eine leere Zeichenkette, Leerstring)

Das Ende der Zeichenkette wird durch das erste schließende Anführungszeichen markiert (nicht etwa das letzte in der Zeile). Daher ergibt sich die Frage, wie ein Anführungszeichen Teil der Zeichenfolge sein kann, wenn das gewollt ist.

Bietet eine Sprache zwei oder mehr Begrenzungszeichen an, kann auf andere Begrenzungszeichen ausgewichen werden: "Das ist's" 'Er sagte "nie und nimmer" und ging'

Falls alle Begrenzungszeichen vorkommen, kann in der Regel ein Begrenzungszeichen in der Zeichenfolge durch eine Escape-Sequenz oder durch Dopplung als Teil der Zeichenfolge angegeben werden.

"Escape-Sequenz, um das Anführungszeichen \" als Teil der Zeichenkette aufzunehmen."(vorwiegend in C-artigen und vielen anderen modernen Sprachen) "Dopplung, um ein "" aufzunehmen"(Verdoppelung des Begrenzers, z. B. in Excel, Pascal, BASIC-Dialekten, CSV oder Rexx)

Die beiden Ansätze sind inkompatibel: In Sprachen, die Verdopplung des Begrenzungszeichens verwenden, werden Escape-Sequenzen nicht als solche erkannt und beenden die Zeichenfolge, was meist zu Syntaxfehlern führt. In Sprachen, die Escape-Sequenzen verwenden, beendet ein verdoppeltes Begrenzungszeichen die Zeichenfolge und beginnt eine neue.

Für bestimmte Sprachen ist es möglich, dass die Unterschiede nur zu verschiedenen Ergebnissen, aber nicht zu Syntaxfehlern führen. Beispielsweise wird "\"'" von C für die Darstellung von "' verwendet. In BASIC bedeutet diese Eingabe die Zeichenfolge \ gefolgt von einem Kommentar. Umgekehrt werden in C nebeneinander stehende Zeichenfolgen-Literale automatisch zusammengefasst, was es so aussehen lässt, als würde ein doppeltes Anführungszeichen in einer Zeichenfolge verschwinden; in Wahrheit wird die Zeichenfolge beendet, eine neue begonnen und die beiden verbunden.

In Algol 60 werden Zeichenketten durch unterschiedliche Symbole begonnen und beendet; dadurch können Zeichenketten auch geschachtelt sein. Beispiele: ʿEr sagte: ʿSo ist's recht!ʾʾ '('Bei beschränktem Zeichenvorrat werden die '('Stringklammern')' durch '('Trigraphen')' dargestellt.')'

String-Literale müssen in vielen älteren Sprachen in einer einzigen Zeile notiert werden, wobei für Zeilenumbrüche Escape-Sequenzen oder andere Lösungen zur Verfügung stehen. Moderne Programmiersprachen bieten in der Regel Möglichkeiten an, mehrzeilige Zeichenketten als solche in den Code einzugeben.

Intern Es gibt mehrere Verfahren, um Zeichenketten effizient abzuspeichern. Zum Beispiel kann ein Zeichen aus dem verwendeten Zeichensatz als Abschlusszeichen definiert werden. Eine Zeichenkette hört dann vor dem ersten Vorkommen dieses Zeichens auf. Eine andere Möglichkeit ist, die Länge der Zeichenkette separat zu speichern.

Repräsentation mit Abschlusszeichen In Programmiersprachen wie C werden die Zeichenketten fortlaufend im Speicher abgelegt und mit dem Nullzeichen (NUL in ASCII) abgeschlossen. Das Nullzeichen ist das Zeichen, dessen binäre Repräsentation den Zahlenwert 0 hat. (Die Ziffer 0 als Zeichen hat eine binäre Repräsentation ungleich 0.) Das folgende Beispiel zeigt, wie eine Zeichenkette mit 5 Zeichen in einem Puffer von 10 Byte Länge abgelegt werden könnte: Zeichen F R A N K NUL k 0 f w Zahlenwerte 46 52 41 4E 4B 00 6B 30 66 77

Die Länge der obigen Zeichenkette ist 5; sie belegt aber 10 Bytes im Speicher. Zeichen nach dem NUL-Zeichen zählen nicht mehr zur Zeichenkette; sie können zu einer neuen Zeichenkette gehören oder (wie in diesem Beispiel) einfach ungenutzt sein. Eine Zeichenkette in C ist ein Array vom Typ char, wobei die Zeichenkette als Ende-Kennung ein Nullzeichen enthält. Deswegen heißen solche Zeichenketten auch nullterminiert, ein älterer Begriff ist ASCIIZ-String oder C-String. Da das Nullzeichen selbst auch noch Speicherplatz benötigt, den die Zeichenkette belegt, ist der Speicherbedarf einer Zeichenkette immer mindestens 1 Zeichen größer als die nutzbare Länge der Zeichenkette. Als Länge der Zeichenkette wird die Anzahl der Zeichen vor der Endekennung bezeichnet. Sie wird von der C-Funktion strlen() ermittelt.

Der Vorteil dieser Methode ist, dass die Länge eines Strings nur durch den verfügbaren Speicher begrenzt ist und nicht zusätzlich von der Kapazität des Längenfeldes; ein Nachteil ist, dass er keine Null-Zeichen enthalten kann, und dass der Umgang vergleichsweise schwierig und ineffizient ist; beispielsweise kann die Länge eines solchen Strings nur durch das Abzählen der Zeichen ermittelt werden.

Poul-Henning Kamp, ein Mitentwickler des Betriebssystems FreeBSD, bezeichnete in der Fachzeitschrift ACM Queue den Sieg von nullterminierten Strings über Strings mit Längenpräfix als den „teuersten 1-Byte-Fehler“.

Repräsentation mit separater Längenangabe Ebenfalls kann die Länge separat vor dem Inhalt der Zeichenfolge gespeichert werden. Auf diese Art wird kein Zeichen als Begrenzungszeichen verbraucht, das dann nicht mehr Teil einer Zeichenfolge sein kann.

InterpretationLänge F R A N K k 0 f wZahlenwerte 00 00 00 05 46 52 41 4E 4B 6B 30 66 77

Zeichenketten, die so gespeichert werden, können eine bestimmte Länge nicht überschreiten. Die meisten modernen Programmiersprachen, die eine Längenangabe verwenden, stellen für die Länge mindestens 32 Bit bereit; oft ist das Längenfeld genauso groß wie ein Zeiger. Je nach Details können auf 32-Bit-Systemen Zeichenfolgen zwischen 2 und 4 GiB groß sein und auf 64-Bit-Systemen so erheblich mehr, dass die theoretische Begrenzung nie ausgereizt wird.

Speicherung im Pool Die Speicherung von Zeichenketten benötigt viel Speicherplatz und ist eine sehr häufige Aufgabe. Deshalb verwenden viele höhere Programmiersprachen eine besondere Verwaltung, um das möglichst effizient gestalten zu können. Dies ist aber dem Zugriff der Programmierer einer Anwendung entzogen; es gibt in aller Regel keine Möglichkeit, auf diese Verwaltung direkt zuzugreifen oder auch nur festzustellen, ob eine solche aktiv ist.

Es werden alle Zeichenketten in einem zentralen „Pool“ abgelegt. Das Ziel ist, dass jede benötigte Zeichenkette nur genau ein einziges Mal gespeichert wird. Die Variable im Anwendungsprogramm erfährt nur eine Kennnummer, um bei Bedarf auf die Zeichenkette zugreifen zu können.

Die Verwaltung bedient sich für die Organisation schneller und effizienter Methoden (meist einer Hashtabelle). Jedes Mal, wenn eine Zeichenkette gespeichert werden soll, wird nachgesehen, ob eine inhaltsgleiche bereits bekannt ist. Ist das der Fall, wird die Kennnummer der bereits existierenden Zeichenkette zurückgegeben; ansonsten muss sie neu angelegt werden.

Jedes Mal, wenn eine Zeichenkette gespeichert wird, wird ihr Referenzzähler um eins erhöht. Wird eine Zeichenkette an einer Stelle des Programms nicht mehr benötigt (weil ein Unterprogramm beendet ist und die darin enthaltenen Literale sinnlos werden, oder weil eine Variable einen anderen Wert erhält), wird dies der Verwaltung gemeldet und der Referenzzähler um eins vermindert. Damit lässt sich feststellen, welche der gespeicherten Zeichenketten im Moment verwendet werden – hat der Referenzzähler den Wert Null, wird sie zurzeit nicht gebraucht. Dadurch wäre es möglich, bei Engpässen an Speicherplatz die Verwaltung zu reorganisieren und unbenötigte Zeichenketten zu löschen (Garbage Collection). Dies wird allerdings möglichst vermieden, weil es dazu kommen kann, dass bei jedem Aufruf eines Unterprogramms immer wieder gleichlautende Zeichenketten erneut zugewiesen werden; fortgeschrittene Verwaltung registriert auch die Häufigkeit des Abspeicherns und löscht nur besonders selten benutzte und lange Zeichenketten.

Handelt es sich um eine Programmiersprache, in der ein Quelltext kompiliert und das Ergebnis in einer Objektdatei abgelegt wird, dann erhalten in ihrer Datensektion nach Auflösung aller Präprozessor-Operationen die resultierenden statischen Zeichenketten meist eine ähnliche tabellarische Verwaltung. Allerdings gibt es hier weder ein Löschen noch Referenzzähler. Diese Literale stehen auch der zentralen Zeichenkettenverwaltung nicht zur Verfügung, da bei dynamischer Einbindung nicht gesichert ist, dass diese Datensektion immer geladen ist.

Multibyte-Zeichen Traditionell wurden zur Repräsentation eines einzelnen Zeichens 8 Bit verwendet, was bis zu 256 verschiedene Zeichen ermöglicht. Um gleichzeitig Zeichen vieler Fremdsprachen und vor allem auch nichtlateinischer Schriften wie etwa Griechisch verarbeiten zu können, reicht das nicht aus.

Mittlerweile stellen viele Programmiersprachen die Möglichkeit zur Speicherung eines einzelnen Zeichens in 2 Byte oder 4 Byte zur Verfügung; konsequenterweise vermeidet man heute in diesem Zusammenhang das Wort Byte und spricht allgemein von Zeichen.

Unter Microsoft Windows sind alle Systemfunktionen, die Zeichenketten verwenden, in einer Version mit nachgestelltem A (für ANSI, meint 1 Byte nach ISO 8859) verfügbar sowie mit nachgestelltem W (für wide, Multibyte). Einfacher ist es aber, dies gar nicht explizit anzugeben: Kompiliert man ein Programm mit der entsprechenden Option, so werden automatisch alle neutralen Funktionsaufrufe auf 1 Byte/Zeichen oder auf Multibyte umgestellt. Genauso gibt es für die Programmiersprachen C++ und C Präprozessor-Makros, mit deren Hilfe sämtliche Standardfunktionen und Literale in einer unbestimmten Version im Quelltext notiert werden können; bei der Kompilierung wird dann die gerade angemessene Funktion eingesetzt. Per Definition verarbeiten die historischen Standardfunktionen in C immer genau 1 Byte/Zeichen.