如果我将下面的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字符集)
你知道第一种情况出了什么问题吗?
谢谢你的帮助。
通过在ZPL模板(例如)的顶部放置^CI28
命令来使用UTF-8
^XA
^CI28
^CF0,80
^FO70,40^FDavión^FS
^XZ
根据Zebra ^CI
的编程指南文档,使用7将获得带有一些特定字符替换的代码页850。当你说你的文件是用ANSI编码的,我想你指的是代码页Windows-1252或ISO-8859-1(latin1)。
Windows-1252和latin1中的字符é
是#00E9,但在850中是Ú
;您可能想要850中é
的#0082。使用^CI7
,显然也可以得到一个带有#007B的é
,因为这是使用该命令进行的特定字符替换之一。
使用UTF8(与^CI28
一起使用)可能是一种可行的方法,因为它得到了广泛的支持和理解,但请注意,您也可以尝试^CI27
(即使您有不支持^CI28
的旧版本Zebra固件,它也可以工作),这应该会让您获得代码页1252。如果这不起作用,您需要使用代码页850对文本进行编码。
如果您将第一个示例复制并粘贴到可以在UTF-8和ANSI(Notepad++)之间转换的文本编辑器中,您将看到第一个示例编码为
^XA
^FO50,20
^CI7
^A0N,25,15
^FD
Amitié
^FS
^XZ
这将导致ZPL在渲染时出现问题。请参阅ANSI和UTF-8的联机示例。
要解决此问题,您可以首先对值进行编码(例如,用十六进制,然后以^FH
为前缀)
以下是我所做的:
- 使用^CI28定义UTF-8字符集
- 使用瑞士unicode字体。对于我的情况,我只需要在一行上编码,我不想更改文档或打印机设置上的任何其他内容。为此,我使用了^A@N,44,30,E:TT0003M_.TTF。如果你想定义整个文档的字体,请查看下面的第一个链接
- 准备字符串以识别^FH紧接在^ FD之前的UTF-8编码
- 对文档进行编码,以将非ASCII字符替换为其HEX表示形式:
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();
}
我为达成解决方案而收集的信息:
- 在zebra-zpl打印机上下载和使用字体
- ZPL在线编辑器
- 这个问题的混合答案