Language Support in ZPL (Hindi, Arabic, Chinese, Japanese, Korean, Hebrew, Spanish)
How to print Hindi, Arabic, Chinese, Japanese, Korean, Hebrew and Spanish accents on a ZPL printer, with the right code page and font approach for each.
The built-in fonts only cover Latin text. For every other script you combine three things: an encoding (^CI), a font that has the glyphs, and, for some scripts, layout support in the firmware.
Quick matrix
| Language | Encoding | Font | Layout notes |
|---|---|---|---|
| Spanish, French, German, Portuguese | ^CI27 or ^CI28 |
Font 0 usually works | Simple. Just match the host encoding |
| Hebrew | ^CI28 (or ^CI37 for CP1255) |
Hebrew-capable TrueType | Right-to-left, see below |
| Arabic | ^CI28 |
Arabic TrueType | Needs right-to-left and letter shaping |
| Hindi (Devanagari) | ^CI28 |
Devanagari TrueType, e.g. Noto Sans Devanagari | Needs complex-script shaping |
| Chinese | ^CI28 |
CJK TrueType, or printer’s Asian font | Large font files |
| Japanese | ^CI28 or ^CI31 (Shift-JIS) |
Japanese TrueType | Large font files |
| Korean | ^CI28 |
Korean TrueType | Large font files |
Spanish and other accented Latin text
^XA
^CI28
^FO40,40^A0N,45,45^FH^FD¡Qué día! Año nuevo^FS
^XZ
If the accents come out wrong, the host is sending a different encoding than ^CI expects. See special characters.
Right-to-left: Hebrew and Arabic
Use ^FP (field parameter) with R to print right-to-left:
^XA
^CI28
^CWZ,E:HEBREW.TTF
^FO600,50^FPR^AZN,50,50^FDשלום עולם^FS
^XZ
Arabic additionally needs letters joined into their contextual forms. Depending on firmware, the printer may do this itself; if not, characters print isolated and disconnected.
Hindi and other complex scripts
Devanagari requires shaping: combining vowel signs and conjuncts must be reordered and substituted. Support varies by printer model and firmware version. If the result looks wrong (separated marks, wrong order):
- Update the firmware and retest.
- Or render the text on the host and print it as a graphic. The text-to-graphic converter does this in your browser, using your system’s shaping engine, then outputs
^GF.
Chinese, Japanese and Korean
CJK fonts have tens of thousands of glyphs and files of 5 to 20 MB or more. Options:
- Printer’s own Asian fonts, available as a factory option on some industrial models. These are license-restricted; see restoring factory fonts.
- Download a CJK TrueType font to
E:if you have the flash space, then print with^A@and^CI28. - Print as graphics when you only have a few fixed strings.
^XA
^CI28
^CWZ,E:NOTOSANSCJK.TTF
^FO50,50^AZN,60,60^FD你好 こんにちは 안녕하세요^FS
^XZ
Always test with real data
Some characters fall outside the font even if the script is supported; the printer then prints a box or blank. Test the exact strings you will use. See font not printing or showing blocks.
Start with what the label actually needs
Before you choose a method, ask a blunt question: does the text change? A label that says the same thing every time, say a regulatory warning in four languages, is an ideal candidate for a pre-rendered graphic. You design it once, check it with a native speaker, and print the image forever. A label that merges live data in a non-Latin script, such as customer names, needs a font on the printer or a render step in your software.
That single decision usually settles the approach. Static text goes to graphics. Dynamic text goes to fonts, unless the script is one the printer can’t shape properly, in which case you render the dynamic text to an image on the server and send that.
Latin-script languages are the easy case
Spanish, French, German, Portuguese, Polish, Turkish and similar languages mostly need extra letters with accents or marks. Font 0 handles many of them once the character set is right. The usual snag is encoding, not fonts, and the fix is in Unicode and code pages. For Turkish, Polish and other Central or Eastern European languages, check carefully, since the special letters can fall outside the default font’s coverage. Test every special letter your data includes.
Right-to-left scripts
Arabic and Hebrew read from right to left, and a few things follow from that. The text should start at the right edge of its box and run leftwards, which is what the field-parameter command is for. Numbers and Latin words inside the sentence still read left to right, and getting mixed text to order correctly is the tricky bit. If your labels mix Arabic with product codes, print a test with real data and ask a native reader to look at it. Don’t rely on your own eyes.
Arabic adds another complication: letters change shape depending on where they sit in a word. Without shaping support, you get a row of disconnected letters, which is readable to nobody. Support depends on the printer and firmware. If your test comes out disconnected, render the text as a graphic instead.
Devanagari and other complex scripts
Hindi, Marathi and several other languages use scripts in which vowel marks attach above, below or before the base letter, and consonants merge into conjuncts. Doing that correctly takes a shaping engine. Some printers have one, many don’t. As with Arabic, the reliable fallback is to draw the text on a computer, which has a complete shaping engine, and send the result as a bitmap. Our text-to-graphic tool does exactly that in your browser, so you can try it with your own wording and see how it looks before building anything.
Chinese, Japanese and Korean
These scripts have thousands of characters, so fonts are large. Some industrial printers ship with, or offer, built-in Asian fonts, and those are usually licensed rather than free. If yours doesn’t, you can download a font, but check the file size against free memory first. It’s common to store a trimmed font containing only the characters you’ll use. For fixed text, a graphic again avoids the whole question.
For Japanese specifically, you’ll see two encodings in the wild: UTF-8 and the older Shift-JIS. Use whichever your system produces, and set the matching ^CI value.
Always get a human to check
Whatever method you pick, have someone who reads the language look at a printed sample. Shaping errors and wrong-direction text can look plausible to anybody who doesn’t read the script. It’s a small step that can prevent an embarrassing batch of labels. If a font prints boxes for some characters, work through font not printing or showing blocks.
Practical tips
Keep a test label for each language with a representative string. Store fonts on E:, as explained in flash versus RAM. Note which printer firmware you tested, since results can change after an upgrade. And if one printer model behaves differently from another, see fonts by printer model.
Short answers
Which free font covers the most scripts? The Noto family is designed for broad coverage, though each script usually comes as its own file.
Can one label mix several scripts? Yes, if the font covers them all or you use several fields with different fonts.
Do I need a different printer for Arabic or Hindi? Not necessarily. Graphics work on any ZPL printer.
Where do I learn the downloading steps? In the TrueType download guide.
Last reviewed 2026-10-20