Печать символов с острым в 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();
}
Информация, которую я собрал, чтобы найти решение: