7

を使用して9の3バーコードを生成するのは簡単でしたFont()

Font f = new Font("Free 3 of 9", 80);
this.Font = f;

Label l = new Label();
l.Text = "*STACKOVERFLOW*";
l.Size = new System.Drawing.Size(800, 600);
this.Controls.Add(l);

this.Size = new Size(800, 600);

その動作。バーコードが表示され、スキャンできます。ここで、 Code 128のような他のものを使用したいと思います。そのためには、フォントをインストールして(完了)、変更する必要があります。

Font f = new Font("Free 3 of 9", 80);Font f = new Font("Code 128", 80);

その後、ウィンドウにバーコードが表示されます。問題は、Imがそれをスキャンできないことです。バーコードに正しい開始タグと停止タグを使用していないためだと思います。私が理解したように、常に開始/停止文字か何かがなければなりません。9の3の場合、コード128の*は不明です。ウィキにはスタートコードAがあるので試してみました

Font f = new Font("<Start Code A>test<Stop>", 80);Font f = new Font("<Start Code A>test<Stop Code A>", 80);など...出力をスキャンできません。スキャナーが開始文字と停止文字を見つけることができないためです。何か案は?ありがとうございました

4

3 に答える 3

4

コード 128 は、まったく問題なくフォントで表すことができます。ただし、バーコードのコンテンツに基づいて動的に計算する必要があるチェックサム文字を最後に含める必要があるため、3 of 9 よりも注意が必要です。それぞれ異なる開始文字を持つ 3 つの異なるバージョンもあります。

つまり、バーコードは次のように配置する必要があります。

[start char][barcode][checksum][stop char]

code128 の利点は、3 of 9 よりもはるかに簡潔であることです。

このページは、チェックサムを計算するアルゴリズムを理解するのに役立ちました。

アルゴリズムの非常に一般的な概要は次のとおりです。

  1. バーコードの各文字には、文字の内容とバーコード内の位置に応じて、特定の値が割り当てられます。

  2. 上記の 1) のすべての値が合計されます。

  3. 上記 2) の合計の係数 103 の値を取得します。

  4. ほとんどの場合、チェックサム文字は、上記の 3) で決定された (モジュラス値 + 32) の ASCII コードになります。

いくつかのニュアンスがありました。最終的には、このアルゴリズムをすべて JavaScript で作成する必要がありました (質問はありません)。私自身の将来の参考のために、そしてニュアンスのいくつかを示すために、これはそれがどのように見えるかです:

/*
 * This is the variable part of my barcode, I append this to a 
 * static prefix later, but I need to perform logic to compute the 
 * checksum for this variable. There is logic earlier that enforces 
 * this variable as a 9 character string containing only digits.   
 */ 
var formIncrement = // a 9 char "digit" string variable

/*
 * Dynamically compute the total checksum value (before modulus) 
 * for the variable part of my barcode, I will need to get a modulus 
 * from this total when I am done. If you need a variable number of 
 * characters in your barcodes or if they are not all digits 
 * obviously something different would have to be done here.  
 */ 
var incrementCS = ((parseInt(formIncrement.charAt(0)) + 16) * 7) +
                  ((parseInt(formIncrement.charAt(1)) + 16) * 8) +
                  ((parseInt(formIncrement.charAt(2)) + 16) * 9) +
                  ((parseInt(formIncrement.charAt(3)) + 16) * 10) +
                  ((parseInt(formIncrement.charAt(4)) + 16) * 11) +
                  ((parseInt(formIncrement.charAt(5)) + 16) * 12) +
                  ((parseInt(formIncrement.charAt(6)) + 16) * 13) +
                  ((parseInt(formIncrement.charAt(7)) + 16) * 14) + 
                  ((parseInt(formIncrement.charAt(8)) + 16) * 15);

/*
 * 452 is the total checksum for my barcodes static prefix (600001), 
 * so it doesn't need to be computed dynamically, I just add it to 
 * the variable checksum total determined above and then get the 
 * modulus of that sum:  
 */ 
var checksum = (452 + incrementCS) % 103


var barcode = "š600001" + formIncrement

/*
 * The 0 and the 95 - 102 cases had to be defined explicitly because 
 * their checksum figures do not line up with the javascript char 
 * codes for some reason (see the code 128 definition table in the 
 * linked page) otherwise we simply need to get the charCode of the 
 * checksum + 32. I also tack on the stop char here. 
 */ 
switch (checksum) {
    case 0 :
    barcode += "€œ";
    break;
    case 95 :
    barcode += "‘œ";
    break;
    case 96 :
    barcode += "’œ";
    break;
    case 97 :
    barcode += "“œ";
    break;
    case 98 :
    barcode += "”œ";
    break;
    case 99 :
    barcode += "•œ";
    break;
    case 100 :
    barcode += "–œ";
    break;
    case 101 :
    barcode += "—œ";
    break;
    case 102 :
    barcode += "˜œ";
    break;
    default :
    barcode += String.fromCharCode(checksum + 32) + "œ";
}

return barcode;

私の例の開始文字と停止文字 (š、œ) が、リンクされたページに示されているものと一致していないように見えることに気付くかもしれません。私が覚えているのは、非標準の code128 フォントがあり、これらの文字が正しい文字に変換されたためだと思います。

編集

ドキュメントをもう一度確認しました。ここからフォントを取得したようです。具体的にはそのフォントを使用し、上記のアルゴリズムを使用して、code128b バーコードを作成し、正常にスキャンされましたtest。あなたのチェックサム アルゴリズムは正常に動作しているように見えます。štestwœなぜなら、私たちの両方が持っているからです。wÌtestwÎ

私が使用しているのと同じバーコード フォントを探すことにしました。なぜなら、code128 フォントのブランドが異なれば、開始バーコードと終了バーコードを表すために異なる文字が実装されている可能性があるからです。

于 2012-06-24T17:47:56.437 に答える
1

Barcode128 のウィキペディアのページを見ると、 Bar Code Widthsの段落と表によると、ASCII コード 208-210 を使用してブロックを区切る必要があると思います。

于 2012-06-11T09:08:39.550 に答える
0

仕様

ウィキペディアの Code 128 ページでは、仕様を次のように説明しています。

Code 128 バーコードには 7 つのセクションがあります。

  1. クワイエットゾーン
  2. 開始記号
  3. エンコードされたデータ
  4. チェックマーク(必須)
  5. 停止記号
  6. 最終バー (多くの場合、停止記号の一部と見なされます)
  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!

于 2021-06-25T08:52:37.857 に答える