Utf 8 在ZPL中打印带有锐角的字符

Utf 8 在ZPL中打印带有锐角的字符,utf-8,character-encoding,zebra-printers,zpl,Utf 8,Character Encoding,Zebra Printers,Zpl,如果我将下面的ZPL命令发送到Zebra打印机,它将打印AmitiÙ: ^XA ^FO50,20 ^CI7 ^A0N,25,15 ^FD Amitié ^FS ^XZ 请注意,文件编码为ANSI 注意ZPL命令的使用^CI7(7=>单字节编码-1字符集) 另一方面,如果我将下面的ZPL命令发送到Zebra打印机,它将打印Amitié(这是我实际需要的): 请注意,文件编码为UTF-8 请注意ZPL命令^CI28(28=>Unicode(UTF-8编码)-Unicode字符集)的使用 你

如果我将下面的ZPL命令发送到Zebra打印机,它将打印
AmitiÙ

^XA
^FO50,20
^CI7
^A0N,25,15
^FD
Amitié
^FS
^XZ
  • 请注意,文件编码为ANSI
  • 注意ZPL命令的使用
    ^CI7
    (7=>单字节编码-1字符集)
另一方面,如果我将下面的ZPL命令发送到Zebra打印机,它将打印
Amitié
(这是我实际需要的):

  • 请注意,文件编码为
    UTF-8
  • 请注意ZPL命令
    ^CI28
    (28=>Unicode(UTF-8编码)-Unicode字符集)的使用
你知道第一个案子出了什么问题吗


谢谢您的帮助。

如果您将第一个示例复制并粘贴到可以在UTF-8和ANSI(Notepad++)之间转换的文本编辑器中,您将看到第一个示例编码为

^XA
^FO50,20
^CI7
^A0N,25,15
^FD
Amitié
^FS
^XZ
这将导致渲染时ZPL出现问题。有关和,请参阅联机示例


要解决此问题,您可以首先对值进行编码(例如,将值编码为十六进制,然后使用前缀
^FH

通过在ZPL模板顶部放置
^CI28
命令,使用UTF-8,例如

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

根据Zebra
^CI
的编程指南,使用7将为您提供一些特定的字符替换。当你说你的文件是用ANSI编码的,我想你的意思是或

Windows-1252和latin1中的字符
e
是#00E9,但在850中是
Ú
;您可能希望在850中为
设置#0082。使用
^CI7
显然还可以获得带有#007B的
字符,因为这是使用该命令进行的特定字符替换之一


使用UTF8(与
^CI28
)可能是一种可行的方法,因为它得到了广泛的支持和理解,但请注意,您也可以尝试
^CI27
(即使您有一个不支持
^CI28
的较旧版本的Zebra固件,它也可以工作),这应该会让您获得代码页1252。如果这不起作用,您需要使用代码页850对文本进行编码。

以下是我所做的工作:

  • 使用^CI28定义UTF-8字符集
  • 使用瑞士unicode字体。对于我的情况,我只需要在一行上编码,我不想更改文档或打印机设置的任何其他内容。为此,我使用了^A@N,44,30,E:TT0003M_u2;.TTF。如果要为整个文档定义字体,请选中下面的第一个链接
  • 准备字符串以识别紧靠^FD之前的^FH的UTF-8编码
  • 对文档进行编码以将非ASCII字符替换为十六进制表示:
私有静态字符串ZebraEncode(字符串文本)
{
var ret=新的StringBuilder();
var unicodeCharacterList=新字典();
foreach(文本中的var ch)
{
如果(!unicodeCharacterList.ContainsKey(ch))
{
var bytes=Encoding.UTF8.GetBytes(ch.ToString());
如果(bytes.Length>1)
{
var hexCode=string.Empty;
foreach(变量b,字节)
{
hexCode+=$“{BitConverter.ToString(新字节[]{b}).ToLower()}”;
}
Unicode字符列表[ch]=十六进制代码;
}
其他的
unicodeCharacterList[ch]=ch.ToString();
ret.Append(Unicode字符列表[ch]);
}
其他的
ret.Append(Unicode字符列表[ch]);
};
返回ret.ToString();
}

我为达成解决方案而收集的信息:

  • 答案的混合
^XA
^CI28
^CF0,80
^FO70,40^FDavión^FS
^XZ