最近项目中用到条码打印功能,以往使用code39码字体格式,但由于条码较小打印不下,改用code128码解决。
使用128码开始并不能被识别,查找资料后了解到128码打印需要特殊处理,即需要打印的字符串A,需要经过系列运算 加工成 B,才能被识别。加工过程代码如下(C#代码,其他语言应类似)
public static string GetCode128Str(string vInStr) { //临时变量。用来 int nTemp = 0; int[] nChrInstr = null; char vInstr_Code128 = ' '; char[] vInstrArray = vInStr.ToCharArray(); for (int i = 0; i < vInstrArray.Length; i++) { if (i == 0) { nChrInstr = new int[vInstrArray.Length]; } //将字符转换成ASC码 nChrInstr[i] = (int)vInstrArray[i]; //ASC码进行运算,转换字节 if (nChrInstr[i] >= 32) { nTemp = nTemp + (vInstrArray[i] - 32) * (i + 1); } else { nTemp = nTemp + (vInstrArray[i] + 64) * (i + 1); } } //把每个字符的value值 乘上 字符在字符串中的位置(从1开始算)把每个乘积加起来, //因为CODESET B 为104(这是规定不要问我为什么),所以,还要加上104。 //最后,除以103,所得的余数就是 校验码 的value值,然后在表中找到对应的字符就可以了。 //注:以上是资料上写的 本人也不是太明白 int nCode = (nTemp + 104) % 103; if (nCode >= 95) { switch (nCode) { case 95: vInstr_Code128 = 'Ã'; break; case 96: vInstr_Code128 = 'Ä'; break; case 97: vInstr_Code128 = 'Å'; break; case 98: vInstr_Code128 = 'Æ'; break; case 99: vInstr_Code128 = 'Ç'; break; case 100: vInstr_Code128 = 'È'; break; case 101: vInstr_Code128 = 'É'; break; case 102: vInstr_Code128 = 'Ê'; break; } } else { nCode = nCode + 32; vInstr_Code128 = (char)nCode; } string vReturnStr = "Ì" + vInStr + vInstr_Code128 + "Î"; return vReturnStr; }
以上为转换过程,已验证可用,具体算法规则 还需后续对128编码规则的定义来理解。
补充:
1、code39需要将打印的串 前后用星号(*)包起来。即需打印传A, 实际打印时需 *A*
。
2、code128比code39应该更灵活,单位长度里编码密度更高