# Zebra Programming Language

Die Zebra Programming Language (ZPL; deutsch Zebra-Programmiersprache) ist eine Drucker-Beschreibungssprache der Firma Zebra Technologies. Sie findet insbesondere für Etikettendrucker Anwendung. Die ursprüngliche ZPL wurden zu ZPL II weiterentwickelt, wobei keine hundertprozentige Kompatibilität besteht. ZPL II wird inzwischen von vielen Etikettendruckern verschiedener Hersteller emuliert. Zu nennen wäre hier zum Beispiel der Monarch Language Interpreter (MLI) von Avery Dennison oder der Interpreter in den Druckern der cab Produkttechnik GmbH.
Später wurde der Zebra Basic Interpreter (ZBI) in die Drucker integriert, welcher laut Hersteller Zebra Technologies als Erweiterung zu ZPL II zu sehen ist. Es handelt sich dabei um einen sich an ANSI-Basic orientierenden Interpreter, der primär dafür gedacht ist, bei einem Druckertausch die Umprogrammierung von Software zu vermeiden, die vorher mit einem Etikettendrucker eines Mitbewerbers von Zebra betrieben wurde. Mit ZBI soll es möglich sein, dass der Zebra-Drucker die Druckdaten in einem „fremden“ Datenformat erhält und dieser die Daten dann nach ZPL II konvertiert.
Vorläufer von ZPL ist EPL (Eltron Programming Language), die Druckerbeschreibungssprache der Firma Eltron International, welche mit Zebra Technologies fusionierte.

## Befehle

Die Befehle der Sprache fangen immer mit einem Zirkumflex an ('^'). Derzeit versteht ZPL II über 170 Befehle. Jede Formatierung muss mit dem Befehl ^XA beginnen und mit ^XZ enden. Z.B. wird die Schriftartgröße dem Drucker mit ^ADN,x,x bekanntgegeben, wobei x eine Ganzzahl ist; ^ADN,18,10 ist die kleinste Größe und ^ADN,180,100 die größte erlaubte.
Da ZPL die Sprache zur Steuerung von Etikettendruckern ist, gibt es Befehle für den Drucker und Befehle für das aktuelle Etikett (Label). Befehle für den Drucker, sogenannte control commands, beginnen mit dem Präfix ~. Die Etikett-Formatbefehle beginnen mit dem o. g. Präfix ^. Jedoch sind diese Präfixe auch konfigurierbar mithilfe der Befehle ~CT (für Druckerbefehle) und ^CC für Formatbefehle.
Ein Befehl hat folgenden Aufbau: Präfix Befehlscode [Parameter,…]
Das Präfix ist eben ^ oder ~, der Befehlscode besteht aus ein oder zwei Buchstaben A–Z, und die Parameter (falls nötig) folgen direkt und komma-getrennt. Anhand des ^A Befehls wird das deutlich (siehe nächster Abschnitt). Ein Parameter ist typischerweise entweder ein Zeichen oder eine Ganzzahl. Für Ja/Nein-Optionen wird i. d. R. Y für Ja bzw. aktivieren genutzt und N für Nein bzw. deaktivieren. Optionale Parameter werden einfach ausgelassen, jedoch müssen die Kommata angegeben werden!
Kommentare, welche vom Drucker (bzw. ZPL-Prozessor) ignoriert werden, beginnen mit ^FX und enden vor dem nächsten Befehlspräfix.

### Schriftbild

Um eine Schriftart auszuwählen, gibt es mehrere Befehle. Der einfachste ist ^A:
^Afo,h,w wählt die Schriftart f mit der Orientierung o und Zeichenabmaßen w breit mal h hoch. Die Parameter o, h und w sind optional. Die Schriftart wird über einen Buchstaben oder Ziffer angegeben, wobei die verfügbaren Schriften vom Druckermodell abhängen. Typische Schriften sind: A (winzig), D (klein), E (OCR-B), H (OCR-A) sowie P bis V (von winzig bis riesig). Außerdem gibt es die Schrift 0 (null), welche frei skalierbar ist. Die Orientierung hat vier mögliche Werte: N = normal (ungedreht), R = um 90° im Uhrzeigersinn gedreht, I = um 180° gedreht, B = um 270° im Uhrzeigersinn gedreht. Standard ist natürlich N.
Der Befehl ^CFf,h,w wählt ähnlich ^AfN,h,w die Schrift f mit den Zeichenabmaßen aus, allerdings wird diese Schrift als zukünftige Standardschrift gewählt.
ZPL-fähige Drucker unterstützten i. d. R. mehrere Zeichensätze. Um die aktuelle Zeichenkodierung festzulegen, gibt es den Befehl ^CIx. Der Parameter x gibt einen Zahlencode an, der die Kodierung festlegt, z. B. 0 bis 12 sind Einbyte-Kodierungen für verschiedene Staaten, 13 ist Codepage 850, 27 ist Codepage 1252, 15 ist Shift-JIS, 28 ist Unicode UTF-8 usw. (Eventuell hängt die Unterstützung von der Firmware-Version und den Kodierungstabellen/-dateien ab.)