仕様
ウィキペディアの Code 128 ページでは、仕様を次のように説明しています。
Code 128 バーコードには 7 つのセクションがあります。
- クワイエットゾーン
- 開始記号
- エンコードされたデータ
- チェックマーク(必須)
- 停止記号
- 最終バー (多くの場合、停止記号の一部と見なされます)
- クワイエットゾーン
チェック シンボルは、すべてのシンボルの加重合計 (モジュロ 103) から計算されます。
データのエンコード
フォントは、開始記号と停止記号、およびチェック記号を提供するために必要なデータに加えて、必要なゾーンとラインを処理します。
「チェック ディジットの計算」セクションでは、チェックサムは、開始コードの「値」を、各シンボルの「値」にバーコード文字列内の位置を掛けた積に加算することによって計算されることを説明しています。次に、積の合計がモジュロ 103 で減らされます。この場合の開始コード値は 103 であり、モジュロ 103 は 0 であるため、無視することができ、データ シンボルを集計するだけで済みます。
コード 128B、またはコード セット B、95 文字、ASCII 文字 32 ~ 127 をサポートするフォントである無料のバーコード フォント @ dobsonswを使用します。説明します。
@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);
}
nJoy!