规格
维基百科的Code 128页面解释了以下规格:
Code 128条形码有七个部分:
- 空白区域
- 起始符号
- 编码数据
- 校验符号(必需)
- 停止符号
- 最后一根条(通常被认为是停止符号的一部分)
- 空白区域
校验符号是从所有符号的加权和(模103)计算出来的。
数据编码
字体将处理所需的区域和线条,除了我们需要提供起始和停止符号以及校验符号的数据。
章节校验位计算解释了校验和是通过将起始码“值”与每个符号的“值”乘以其在条形码字符串中的位置的积之和来计算的。然后,产品的总和被减少模103。由于此情况下的起始码值为103,其中模103为0,因此可以忽略它,我们只需要统计数据符号。
使用Free barcode fonts @ dobsonsw,这是一种支持95个字符的Code 128B或Code set B字体,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);
}
享受乐趣!