Ñ and accented characters print incorrectly in ZPL: how to fix them
Numbers and unaccented letters print correctly, but España becomes España or Café becomes Café. This often points to a mismatch between the encoding sent and the encoding the printer interprets. Boxes or gaps also call for a font check.
Three things must agree
Send UTF-8 bytes, place ^CI28 before the text fields and use a font containing the required characters. ^CI28 selects how bytes are interpreted: it does not convert a Windows-1252 file or repair text that is already corrupted.

1. Identify the symptom
If you see España, look for an incorrect text conversion: these characters are a clue, not proof of where it happened. A box, question mark or gap can mean the font lacks a character or the character was lost before printing. If the label literally shows ^XA or ^FD, use the garbled-text guide linked below.
2. Send UTF-8 and declare ^CI28
Open the file as UTF-8 and check that it contains España, not España. In the sending application, encode the text as UTF-8 once and check that the driver or print service does not convert it afterwards. Put ^CI28 at the beginning of each format and check that no later ^CI changes the encoding before the affected field. Resolve HTML entities and JSON escapes before building the ZPL.
3. Print a minimal label
This example uses font 0 and an area of approximately 60 × 40 mm at 203 DPI. Print through the same channel that fails and compare the output with the expected text. The preview helps check content and layout, but it cannot establish which bytes reach the Zebra or which characters its font contains.
Example with UTF-8 text
^XA
^CI28
^PW480
^LL320
^LH0,0
^FO24,30^A0N,28,28^FDEspaña - Café^FS
^FO24,85^A0N,28,28^FDá é í ó ú ñ ü^FS
^XZExpected output
España - Café
á é í ó ú ñ ü
4. Isolate transmission with ^FH
The second test expresses UTF-8 bytes as hexadecimal and contains only ASCII characters. ^FH enables escapes for the next field; the default indicator is an underscore. Repeat ^FH for every field that needs it. If this version prints correctly and the first one does not, investigate file encoding and transmission. If both fail, also check the font, firmware support and commands added by the application.
The same first line using hexadecimal bytes
^XA
^CI28
^PW480
^LL320
^LH0,0
^FO24,30^A0N,28,28^FH^FDEspa_C3_B1a - Caf_C3_A9^FS
^XZExpected output
España - Café
In UTF-8, ñ is two bytes: C3 B1. _F1 is not a valid UTF-8 ñ. Copy the hexadecimal test to the printer's sending channel without converting the escapes again.
| Character | UTF-8 bytes | Inside ^FH / ^FD |
|---|---|---|
| ñ | C3 B1 | _C3_B1 |
| é | C3 A9 | _C3_A9 |
| á | C3 A1 | _C3_A1 |
| ü | C3 BC | _C3_BC |
5. Check the font if characters are missing
Keep ^CI28 and try a font containing the required glyphs. A downloaded Unicode font can be selected with ^A@ or assigned through ^CW, following the device documentation. On older printers, confirm that the firmware supports ^CI28. Then test real names and addresses: fixing ñ and é does not guarantee that the same font covers every writing system.
Frequently asked questions
Where should I put ^CI28?
After ^XA and before fields containing UTF-8 text. Declare it in every format so you do not depend on the state left by another job.
Why does ^CI28 not fix España?
The text may already be corrupted or still be sent in another encoding. Fix the source and check the bytes delivered by the application.
Does ^FH replace ^CI28?
No. ^FH represents bytes using escapes; ^CI28 tells the printer how to interpret them. The example needs both.
Should I change speed or darkness?
Not to fix encoding. Consistent character substitutions call for checking text, encoding and font. Physical print defects need a different diagnosis.
Related guides
The Zebra prints garbled text or literal ZPL commandsOfficial Zebra documentation
About the author
Eduard Diaz
Eduard Diaz is an IT technician (development) at S-IE, an official Zebra partner with more than 20 years providing identification and labelling services. He builds and maintains EditorZPL to make working with ZPL and Zebra label printers easier.
s-ie.cat