我有以下设置:
Ubuntu 14.04.3 LTS
与Linux work002 3.19.0-47-generic #53~14.04.1-Ubuntu SMP Mon Jan 18 16:09:14 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux
Qt 5.5.1 Opensource 64bit
的工作站
ESC/POS
命令集)。现在,这个设置似乎(初始连接,配对和一旦配对蓝色 LED
二极管打开打印机)工作,因为我可以通过{{3在打印机上打印一些文本方法:
this->ueBtPrinterSocket()->write(QByteArray("Printer ready. @[\\]^`{|}~ ĐŠŽĆČđšžćč"));
但是,我来自斯洛文尼亚,我需要斯洛文尼亚字母,这就是为什么我把斯洛文尼亚字母放到上write
- ĐŠŽĆČđšžćč
,我得到一些中文字母。因此,我尝试根据QBluetoothSocket::write更改打印机代码页,但没有成功:
QByteArray cmdChangeCodePageToSlovene; // ESC t n
cmdChangeCodePageToSlovene.resize(3);
cmdChangeCodePageToSlovene[0]=0x1b;
cmdChangeCodePageToSlovene[1]=0x74;
cmdChangeCodePageToSlovene[2]=0x18;
qint64 result=this->ueBtPrinterSocket()->write(cmdChangeCodePageToSlovene);
qDebug() << Q_FUNC_INFO
<< " bytes written:"
<< result;
qDebug()
输出通知我:
void UeBluetoothManager :: ueSlotBtPrinterPairedAndConnected()bytes 书面:3
没关系。现在,中国制造商最终给我发了一些Android
的代码,这些代码很难称为SDK,并且有一个.jar
库用于处理打印机。我已将此.jar
文件上传到ESC t n function网站,并且我发现了以下反编译方式更改了打印机的代码页:
public int SetCharacterSet(int Value) {
if (g_nConnect != 1) {
return 101;
}
if (!(Value > 0 && Value < 10 || Value > 16 && Value < 19 || Value != 255)) {
return 104;
}
byte[] send = new byte[]{27, 116, 1};
send[2] = (byte)Value;
try {
out.write(send);
return 0;
}
catch (IOException e) {
e.printStackTrace();
return 402;
}
}
这与我更改打印机代码页的Qt
代码基本相同(因此我可以假设打印机命令集至少是基本的ESC/POS
),所以我可以假设我走在正确的轨道上。现在,我已使用Wireshark
检查了蓝牙流量,但是,我找不到0x1b 0x74 18
(更改代码页的命令)数据流发送到打印机。这可能是代码页没有改变的原因,或者有人可以给我一些指导方针吗?我还尝试将代码页更改为Windows-1250
和ISO8859-2: Latin 2
,没有效果。
答案 0 :(得分:1)
问题似乎是您没有将UTF-8字符转换为输出字符集。
QByteArray cmdSetCharSet;
cmdSetCharSet.resize(3);
cmdSetCharSet[0] = 0x1b;
cmdSetCharSet[1] = 0x74;
cmdSetCharSet[2] = 0x2; //OEM850
this->ueBtPrinterSocket()->write(cmdSetCharSet);
QTextCodec *codec = QTextCodec::codecForName("IBM850");
this->ueBtPrinterSocket()->write(codec->fromUnicode(QString("ÄäÖöÜüß$€")) );