在ZPL中打印带有重音的字符

14

如果我向斑马打印机发送以下的ZPL指令,它会打印出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字符集)。

你知道第一个案例有什么问题吗?

感谢您的帮助。

4个回答

25

在你的ZPL模板顶部放置一个^CI28命令,以使用UTF-8编码,例如:

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

5
根据来自Zebra的编程指南文档,使用7的^CI将获得代码页850和一些特定字符替换。当你说文件编码为ANSI时,我认为你指的是代码页Windows-1252ISO-8859-1(latin1)
在Windows-1252和latin1中,字符é是#00E9,但在850中是Ú;你需要#0082来获得850中的é。使用^CI7,你也可以使用#007B获得é,因为这是该命令执行的特定字符替换之一。
使用UTF8(带有^CI28)可能是最好的选择,因为它被广泛支持和理解,但请注意,您也可以尝试^CI27(即使您使用的是不支持^CI28的较旧版本的Zebra固件,也可能有效),这应该可以让您获得代码页1252。如果这不起作用,您需要使用代码页850对文本进行编码。

1
如果您将第一个示例复制并粘贴到可以在UTF-8和ANSI之间转换的文本编辑器(Notepad ++)中,您会发现第一个示例被编码为。
^XA
^FO50,20
^CI7
^A0N,25,15
^FD
Amitié
^FS
^XZ

这将导致您的ZPL在渲染时出现问题。请参考在线示例,了解ANSIUTF-8

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


1

这是我所做的来实现这个目标:

  • 使用^CI28定义UTF-8字符集
  • 使用瑞士Unicode字体。对于我的情况,我只需要在单行上进行编码,而我不想更改文档或打印机设置中的其他任何内容。因此,我使用了^A@N,44,30,E:TT0003M_.TTF。如果您想为整个文档定义字体,请查看下面的第一个链接。
  • 使用^FH^FD之前立即准备字符串以识别UTF-8编码
  • 对文档进行编码,以用其HEX表示替换非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();
    }

我收集的信息以达到解决方案为:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接