优声云小票打印机是国内知名的小票打印机厂商,在对接优声云智能打印机的过程中,需要使用CODE128C编码,那么我们需要把条形码数据转换成打印机ESCPOS指令。接下来,我们介绍使用PHP把条码内容转换成ESC指令集。
code128c介绍
CODE128有三个版本:
- A(数字、大写字母、控制字符)
- B(数字、大小字母、字符)
- C(双位数字)
CODE128A:标准数字和大写字母,控制符,特殊字符
CODE128B:标准数字和大写字母,小写字母,特殊字符
CODE128C:[00]-[99]的数字对集合,共100个
●可用128个字符分别在A、B或C三个字符串集合中。
我们使用的CODE128C条码内容必须是偶数个字节长度,且只能为纯数字。
类似于下面这种
$code = '12345678';
我们需要把code变量分成两个字节长度的字符串,可分为4份
$arr = str_split($code, 2);
打印arr变量可看到code变量已经被分割了。
array(4) {
[0]=>
string(2) "12"
[1]=>
string(2) "34"
[2]=>
string(2) "56"
[3]=>
string(2) "78"
}
我们需要把这些2字节的内容当做ASCII码来处理,并取得对应的字符。把这些字符依次串联起来。
使用chr函数取得字符串:
$result = '';
$arr = str_split($str, 2);
foreach ($arr as $v) {
$result .= chr($v);
}
得到result变量后,我们使用CODE128C指令集来拼接:
$esc = '{C'.$result
由此得到code条码内容的esc指令,下发给对应的云打印机打印即可。
思考
code变量为偶数长度,那么分割成2字节字符串是可以均分的,但是如果code是奇数长度呢
假如:
$code = '1234567';
那么分割成2个字节字符串为:
array(4) {
[0]=>
string(2) "12"
[1]=>
string(2) "34"
[2]=>
string(2) "56"
[3]=>
string(1) "7"
}
此时数组内第四个值则为一个长度
chr(7) == chr('07');
上述等式是完全相等的,那么可以发现
‘12345607’和’1234567’的条形码指令是完全一样的,这个时候该怎么办呢。
奇数长度处理
针对上述情况,不同的软件有不同的处理方法,通常有以下两种:
1、事先检测数字位数,如果是奇数位,则在首位补0,如
1234567→01234567
2、在最后一个单个数字前转换字符集,如
//前面的两个字节字符串按照CODE128C标准,最后一个不足2字节的字符按照CODE128B标准
start C 12 34 56 code B 7 check stop
-
第一种方法由于改变了数据内容,困此并不是最好的解决方案,对于纯粹表示数值是可以接受的,如果是表示数字串则不合适,实际上编写一个通用程序无法预见要编制的条码究竟是数值型数据还是字符型数据。
-
第二种方法是大多数生成条码软件使用的方法,虽然并没有严格遵循使用C字符集,但这并不违反CODE 128的规则,因为CODE-128并没有限制三个字符集的使用范围。只要根据数据型类选择最优方案即可。
按照第一种方法:
code变量改变为:
$code = '01234567';
再来计算code的esc指令即可。
第二种方法
$result = chr(12).chr(34).chr(56);
拼接指令:
$esc = '{C'.$result.'{B'.7;
如此,则完成了任意数字转换为CODE128C标准的ESC/POS指令。