Печать символов с острым в ZPL

Если я отправлю приведенные ниже команды ZPL на принтер Zebra, он напечатает AmitiÙ:

^XA
^FO50,20
^CI7
^A0N,25,15
^FD
Amitié
^FS
^XZ
  • Обратите внимание, что кодировка файла ANSI,
  • Обратите внимание на использование команды ZPL ^CI7 (7 => Однобайтовая кодировка - Франция 1 набор символов).

С другой стороны, если я отправлю приведенные ниже команды ZPL на принтер Zebra, он напечатает Amitié (что мне действительно нужно получить):

^XA
^FO50,20
^CI28
^A0N,25,15
^FD
Amitié
^FS
^XZ
  • Обратите внимание, что кодировка файла UTF-8,
  • Обратите внимание на использование команды ZPL ^CI28 (28 => Unicode (кодировка UTF-8) - набор символов Unicode).

Вы знаете, что не так в первом случае?

Спасибо за помощь.

3 ответа

Используйте UTF-8, поместив ^CI28 команда в верхней части шаблона ZPL, например,

^XA
^CI28
^CF0,80
^FO70,40^FDavión^FS
^XZ

Согласно руководству по программированию от Zebra ^CI использование 7 даст вам кодовую страницу 850 с некоторыми заменами определенных символов. Когда вы говорите, что файл был закодирован в формате ANSI, я предполагаю, что вы имеете в виду кодовую страницу Windows-1252 или ISO-8859-1 (латиница 1).

Характер é в Windows-1252 и latin1 это # ​​00E9, но это Ú в 850; Вы хотели бы № 0082 для é в 850. Использование ^CI7 Вы могли бы также получить é с #007B, поскольку это одна из замен конкретных символов, сделанных с помощью этой команды.

Использование UTF8 (с ^CI28), вероятно, это путь, так как он широко поддерживается и понят, но обратите внимание, что вы также можете попробовать ^CI27 (который может работать, даже если у вас установлена ​​более старая версия прошивки Zebra, которая не поддерживает ^CI28) и это должно получить кодовую страницу 1252. Если это не сработает, вам нужно будет кодировать свой текст с использованием кодовой страницы 850.

Если вы скопируете и вставите свой первый пример в текстовый редактор, который может конвертировать между UTF-8 и ANSI (Notepad++), вы увидите, что первый пример закодирован как

^XA
^FO50,20
^CI7
^A0N,25,15
^FD
Amitié
^FS
^XZ

И это будет причиной проблем с вашим ZPL при визуализации. Смотрите онлайн примеры для ANSI и UTF-8.

Чтобы это исправить, вы можете сначала закодировать свои значения (например, в шестнадцатеричном виде, а затем префикс с ^FH)

Вот что я сделал для этого:

  • Определите кодировку UTF-8 с помощью ^CI28
  • Используйте швейцарский шрифт Unicode. В моем случае мне нужно было кодировать только одну строку, и я не хотел ничего менять в настройках документа или принтера. Для этого я использовал ^A@N,44,30,E:TT0003M_.TTF. Если вы хотите определить шрифт для всего документа, перейдите по первой ссылке ниже.
  • Подготовлена ​​строка для распознавания кодировки UTF-8 с ^FH непосредственно перед ^FD
  • Закодировал документ, чтобы заменить символы, отличные от ASCII, их шестнадцатеричным представлением:
    private static string ZebraEncode(string text)
    {
        var ret = new StringBuilder();

        var unicodeCharacterList = new Dictionary<char, string>();
        foreach(var ch in text)
        {
            if (!unicodeCharacterList.ContainsKey(ch))
            {
                var bytes = Encoding.UTF8.GetBytes(ch.ToString());
                if (bytes.Length > 1)
                {
                    var hexCode = string.Empty;
                    foreach(var b in bytes)
                    {
                        hexCode += $"_{BitConverter.ToString(new byte[] { b }).ToLower()}";
                    }

                    unicodeCharacterList[ch] = hexCode;
                }
                else
                    unicodeCharacterList[ch] = ch.ToString();

                ret.Append(unicodeCharacterList[ch]);
            }
            else
                ret.Append(unicodeCharacterList[ch]);
        };

        return ret.ToString();
    }

Информация, которую я собрал, чтобы найти решение:

Другие вопросы по тегам