Каким образом напечатать специальные символы на термопринтерах Godex?

Есть несколько термопринтеров Godex, на которых печатаются коды для "Честного знака". <br/> Стандарт Datamatrix для "Честного знака" (точнее — GS1 Datamatrix) требует в начале символа  и разделения некоторых полей (91, 92, 93) символом . В одном из примеров мы нашли, что для печати  в Datamatrix на EZPL нужно добавить последовательность "~1" в команду XRB (печать Datamatrix). Программа GoLabel при формировании этикетки с Datamatrix (если подставляешь символ GS) выводит его в EZPL в виде "", но при отправке на принтер это строка печатается как есть, то же самое происходит и с . <br/> <br/> Печать ведётся напрямую по сети на порт 9100, в языке EZPL. Документацию читали — пока не помогло. Единственное, что нашли — при печати штрихкода Code 128 с  нужно в данных команды BQ подставить "&G", но это не работает для команды XRB (Datamatrix). <br/> <br/> Вопрос: как вставить  в начало Datamatrix при печати на EZPL через команду XRB? <br/> <br/> P.S. В большинстве случаев это не мешает, т.к. сканер при считывании Datamatrix удаляет  как признак начала, но сохраняет  как разделитель. Однако есть пару случаев, где это не проходит: <br/> - какая‑то экзотическая модель кассового аппарата (пока не определили) <br/> - программа "ЧЗ бизнес", которая утверждает, что структура Datamatrix не соответствует стандарту (в то время как обычная программа "Честный знак" нормально обрабатывает коды без ).
  • 17 марта 2026 г. 5:01
Ответы на вопрос 1
Коротко — спецсимволы надо не «экранировать» текстом, а вставлять в тело команды как реальные управляющие байты (например ASCII 29 = 0x1D для Group‑Separator / разделителя). Для FNC1 в GS1‑DataMatrix принтеры либо понимают специальную опцию кодировщика (флаг «GS1 / FNC1»), либо требуют поставить в начало данных соответствующий управляющий байт.

Что попробовать и как сделать на практике

1) Вставить байт 0x1D (ASCII 29) прямо в поле данных XRB
- Если вы формируете и отправляете EZPL «по сети» (raw TCP порт 9100), включите в строку команды в нужных местах байт 0x1D. Примеры:
  - Python (bytes): cmd = b'XRB ...,"' + b'\x1D' + b'011234567890..."\\n'
  - C# (строка в кодировке): var cmd = "XRB ...,\"" + ((char)29) + "011234...\"\\n"; и отправить как байты Encoding.ASCII.GetBytes(cmd)
- Если вы вставите текстовую последовательность вроде "~1" или "&G" и принтер печатает её как символы «~1», значит эта последовательность не интерпретируется драйвером — нужно именно реальное управление.

2) FNC1 в начале DataMatrix
- Уточните в мануале EZPL вашей модели, есть ли у XRB параметр «GS1» / «FNC1» (некоторые принтеры имеют флаг режима кодировки для Datamatrix). Если есть — включите его (тогда принтер автоматически поместит FNC1 в начало).
- Если такого флага нет, вставьте в начало данных тот же управляющий байт (обычно 0x1D) — многие сканеры и декодеры воспринимают именно этот байт как FNC1/разделитель в GS1 DataMatrix.

3) Что часто мешает
- Визуальные редакторы (GoLabel и др.) иногда показывают «заместитель» и при экспорте превращают символ в видимый текст или в последовательность, которая потом печатается буквально. В таком случае:
  - Либо экспортируйте «сырые» EZPL и затем программно замените плейсхолдер на байт 0x1D перед отправкой на принтер;
  - Либо используйте низкоуровневую отправку (socket) с уже готовой байтовой командой.

4) Если не работает
- Проверьте: действительно ли принтер поддерживает FNC1/GS1 для DataMatrix в данной прошивке (модели отличаются). Если при вставке 0x1D ничего не меняется — пришлите пример конкретной строки XRB, которую вы отправляете, и модель принтера. Я помогу составить корректный байтовый поток.

Резюме: вставляйте символ разделителя / FNC1 как реальный управляющий байт 0x1D в данные команды XRB (или включите GS1/FNC1‑флаг XRB, если он есть). Если GoLabel «портит» строку — заменяйте плейсхолдер на 0x1D перед отправкой на порт 9100.
Похожие вопросы