最近项目中用到条码打印功能,以往使用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应该更灵活,单位长度里编码密度更高
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。