Everything up to ^FS is content
^FD takes no parameters: whatever follows it is the data, until an ^FS turns up. That includes spaces, commas and full stops — nothing in there is read as an argument.
This rule is what explains the most common mistake in the whole language. If the ^FS is forgotten, the next command is not read as a command: it becomes more text belonging to the previous field. Three address fields with no ^FS between them print as one long line, with the commands themselves printed in the middle of it.
- ^FD…^FS — the required pair. ^FD opens the content, ^FS closes the field.
- ^FV — the variant whose content is cleared after printing, used in stored templates.
- ^FH — allows hexadecimal bytes inside ^FD, escaped with an underscore.
- In a barcode, ^FD carries the payload rather than visible text.
Accents and ^CI28
^FD takes accented characters fine, as long as the printer knows how to interpret the bytes. That is what ^CI28 is for, placed straight after ^XA: it says the data arrives as UTF-8.
Without it, “Café” arrives as “Café” — the two bytes of é read as two separate characters. If the system generating the file cannot emit UTF-8, the route out is ^FH with escaped bytes: ^FH^FDCaf_C3_A9 prints “Café”.
Characters that cannot go in raw
The caret and the tilde are ZPL's control characters, so an ^FD containing one mid-text ends the field there and the rest becomes a command. An address with a literal “~” needs ^FH, or the control character swapped with ^CC and ^CT.
Worth knowing too that the ^FX comment ends at the next caret — writing a command name inside a comment creates a real command, which is the same trap arriving from the other side.