在蓝牙打印机上打印UTF-8字符

4

我有一个应用程序,需要在Zebra iMZ320蓝牙打印机上打印,但是遇到了一些UTF-8特定字符(Æ、Ø或Å)的问题。

我连接设备的方法如下:

        BluetoothDevice device = BluetoothAdapter.getDefaultAdapter().getRemoteDevice(macAddr);
        Method m = device.getClass().getMethod("createRfcommSocket", new Class[] { Integer.TYPE });
        bSocket = (BluetoothSocket)m.invoke(device, new Object[] { Integer.valueOf(1) });
        bSocket.connect();
        outStream = bSocket.getOutputStream();
        inStream = bSocket.getInputStream();

在打开套接字后,我正在使用CPCL发送数据:

        String cpclData = "! U1 SETLP 5 2 24 \r\n"+text+"\r\n";
        outStream.write(cpclData.getBytes());
        outStream.flush();

当我尝试打印所提到的字符时,会输出一些异常字符。我联系了Zebra公司,其中一位工程师建议我尝试以下操作:
! 0 200 200 80 1 
IN-MILLIMETERS 
JOURNAL 
CENTER 
COUNTRY NORWAY
TEXT 4 0 0 8 COUNTRY IS NORWAY OR DENMARK
TEXT 4 0 0 15 Æ Ø Å
PRINT

但它完全没有任何作用。
5个回答

5

如果您想从Android设备打印标签,那么很简单;只需要在写入数据时使用“ISO-8859-1”编码即可。示例:

String cpclData = "! U1 SETLP 5 2 24 \r\n"+text+"\r\n";
outStream.write(EncodingUtils.getBytes(cpclData, "ISO-8859-1"));
outStream.flush();

这是设置编码的正确方式。不幸的是,一些中国通用打印机在使用希腊语或俄语等非西欧语言时仍然无法正确使用正确的字母表,并且会打印垃圾字符。 - andreszs

1

1

CPCL语言不支持Unicode。虽然如此,您可以在ZPL中实现它,并且iMZ支持ZPL。请查看link


2
“CPCL语言不支持Unicode”。这个问题有没有文档记录?如果有的话,提供一个链接会很好。 - Gaurav Gupta

0
在一个类似的问题中,我尝试通过蓝牙将西班牙特殊字符打印到Zebra MZ220打印机上,最终我做了以下操作(在这个答案中,我添加了字符Å、Æ、Ø、å、æ、ø):
定义一段代码,将目标字符串转换为所需的字节数组:
public class Util
{
    public final static String  caracteresEspeciales        = "ÜüÁáÉéÍíÓóÚúÑñÅÆØåæø";

    public final static byte[]  codigoCaracteresEspeciales  = new byte[] {(byte) 0xDC, (byte) 0xFC, (byte) 0xC1, (byte) 0xE1, (byte) 0xC9, (byte) 0xE9,
            (byte) 0xCD, (byte) 0xED, (byte) 0xD3, (byte) 0xF3, (byte) 0xDA, (byte) 0xFA, (byte) 0xD1, (byte) 0xF1, (byte) 0xC5, (byte) 0xC6, (byte) 0xD8,
            (byte) 0xE5, (byte) 0xE6, (byte) 0xF8           };

    public static byte[] stringABytes(String s)
    {
        int i, l, i_especial;
        byte b;
        byte[] b_arr;
        String s_sub;

        if(s == null)
            return null;
        if((l= s.length()) < 1)
            return new byte[0];

        // 逐个字符转换为字节
        b_arr= new byte[l];
        for(i= 0; i < l; i++)
        {
            s_sub= s.substring(i, i + 1);
            i_especial= Util.caracteresEspeciales.indexOf(s_sub);
            if(i_especial < 0)
                b= (s_sub.getBytes())[0];
            else
                b= Util.codigoCaracteresEspeciales[i_especial];
            b_arr[i]= b;
        }

        return b_arr;
    }
}

我们可以从打印机附带的PROMAN-CPCL文档中获取这些十六进制代码(附录C-字符表,Latin 1字符集表)。

  • 将字符串转换并发送。

            String datos_cplc;
            byte[] b_arr;
            ...
            datos_cplc= "! 0 200 200 48 1\r\n" + 
                    "TEXT 7 0 0 0 12345678901234567890123456789012\r\n" + 
                    "TEXT 7 0 0 25 ÜüÁáÉéÍíÓóÚúÑñÅÆØåæø AEIOUaeiou1\r\n" + 
                    "FORM\r\n" + 
                    "PRINT\r\n";
            b_arr= Util.stringABytes(datos_cplc);
            ...
            connection.write(b_arr);
    
  • 结果:

  • enter image description here


    0

    在这里找到了解决方案here

    public byte[] convertExtendedAscii(String input)
    {
            int length = input.length();
        byte[] retVal = newbyte[length];
    
        for(int i=0; i<length; i++)
        {
                  char c = input.charAt(i);
    
                  if (c < 127)
                  {
                          retVal[i] = (byte)c;
                  }
                  else
                  {
                          retVal[i] = (byte)(c - 256);
                  }
        }
    
        return retVal;
    }
    

    2
    如果您要复制粘贴别人的代码,您也应该链接到原始来源 - Charles
    对于印地语字体,即使使用此方法打印,也会出现乱码字符。 :( - Ali_Waris

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