规格
维基百科的 Code 128 页面对规范的解释如下:
Code 128 条码有七个部分:
- 安静区域
- 开始符号
- 编码数据
- 复选符号(必填)
- 停止符号
- 最终柱(通常被认为是停止符号的一部分)
- 安静区域
校验符号是根据所有符号的加权和(模 103)计算得出的。
数据编码
除了我们需要提供开始和停止符号以及检查符号的数据之外,该字体将处理所需的区域和线条。
校验位计算部分解释了校验和是通过将起始代码“值”与每个符号的“值”乘以其在条形码字符串中的位置的乘积来计算的。然后将乘积之和以 103 为模。由于本例中的起始码值为 103,其中 103 为 0,因此可以忽略它,我们只需对数据符号进行计数即可。
使用免费条形码字体@ dobsonsw,它是 Code 128B 或 Code set B,字体支持 95 个字符,ASCII 字符 32 到 127。要显示校验符号,还有 9 个额外的溢出字符,它们是乱序的,需要占。
正如@egerardus 得出的那样,这种特殊字体使用非标准的开始(353
)和停止(339
)符号以及不同范围的溢出字符(8216, 8217, 8220, 8221, 8226, 8211, 8212, 0732, 8364
)。
执行
以下是条码数据编码的工作 C# 实现。
private string BarcodeEncode(string value)
{
int[] overChars = { 8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, 8364 };
char[] valueChars = value.ToCharArray();
int[] checksumVals = new int[value.Length];
for (int n = 0; n < valueChars.Length; n++)
{
checksumVals[n] = (((byte)valueChars[n]) - 32) * (n + 1);
}
int checksum = checksumVals.Sum() % 103;
char check = (char)(checksum + 33);
if (checksum > 93)
check = (char)overChars[checksum - 94];
string start = ((char)353).ToString();
string stop = ((char)339).ToString();
return start + value + check.ToString() + stop;
}
其次是等效的 JavaScript 实现。
function barcodeEncode(value) {
var overChars = [8216, 8217, 8220, 8221, 8226, 8211, 8212, 732, 8364];
var checksum = [...value]
.map((i, n) => (i.charCodeAt(0) - 32) * ++n)
.reduce((a, b) => a + b, 0) % 103;
return String.fromCharCode(353) + value
+ (checksum < 94
? String.fromCharCode(checksum + 33)
: String.fromCharCode(overChars[checksum - 94]))
+ String.fromCharCode(339);
}
开心!