2017年2月26日 星期日

Code 128-C 最佳化規則及轉碼

若還沒看過《由 Code 128 Font 建立 BarCode (含規則) 》建議先前往了解基本的 Code 128 規則。

此文章主要介紹當遇到一串條碼文字時,該如何進行長度最佳化以及特殊控制碼的應用。

同樣記得搭配此份表格服用。


上一篇文章中提到,當條碼唯一連串數字時,可以使用 Set C 進行條碼長度優化,而範例採用 20170226 作為範例進行初步的反向說明。

那麼這次就採用正向的方式來進行說明,假設這次的文字為:94870214

※ Step 1:使用 Start C ( value : 105 , Character : Í)

※ Step 2:將文字依序兩兩一組分開: 94、87、02、14

※ Step 3:查詢對照表文字
  
  第一組為 94,查到 Set C 為 "94" 所對應的 Character 是「~
  第一組為 87,查到 Set C 為 "87" 所對應的 Character 是「w
  第一組為 02,查到 Set C 為 "02" 所對應的 Character 是「"
  第一組為 14,查到 Set C 為 "14" 所對應的 Character 是「.

  因此到目前的文字為: Í~w".

※ Step 4:計算驗證碼,計算結果不再贅述,這邊算出來是「7」( value 23 )

最後再加上結尾 Stop , 完整的文字就是 Í~w".7Î




BUT...

但現在問題來了,以上的例子都是偶數個字元, Set C 骰採用的是「連續兩個字元」,那麼如果遇到奇數個字元的話,該怎麼辦? 例如:「54321」

這時候就必須使用內容中轉碼的功能,參考表格 value 在 99~101 的位置,可以看到有 "Code A"、"Code B"、"Code C",這些代表「從這裡開始轉為使用 Set A/B/C」。

所以在這個「54321」的例子中,我們必須用這種方式表示:
PS : 底下文字的顏色,代表要參考哪個 Set (請看表格)

  1:「Start C」「54」「32」「Code A」「1」「驗證」「Stop」或
  2:「Start A」「5」「Code C」「43」「21」「驗證」「Stop

轉成字碼的話就是   1:「ÍV@É1oÎ」 或    2:「Ë5ÇK54Î」。
注意,方法 2 的「Ë5ÇK54Î」,字碼中有兩個 "5",但前後意義不同:

 第一個 5 ,由於此為 Start A (Ë) 開頭,這裡要對照 Set A ,代表文字為 "5";
 第二個 5 ,由於前方有設定 Code C (Ç),這裡要對照 Set C ,代表文字為 "21";


這就是中途轉碼的方式,也因為這個特性,所以並非只要遇到連續數字都可以轉為 Code C,必須在特定條件下才適合壓縮,底下舉例。

假設現在要建立「a123b」的條碼:

由於文字有小寫,必須要用 Set B,
先看不轉碼一慮使用 Set B:「Ìa123bMÎ」,共 8 碼;
中間轉 Set C:「ÌaÇ,È3bÄÎ」,共 9 碼,不減反增

其原因為若要轉碼,則勢必要多出一個轉碼字元;且如果後方還要再轉回來,則又會再多一個轉碼字元,如上面例子中的「Ç ( Code C )」和「È ( Code B )」,所以原本因為使用 Code C 減少的一個字元碼,反而因為轉來轉去多出的兩個字元碼給抵消甚至超過了。


根據這個特性,可以歸納出底下四個狀況,在這四種狀況下使用 Set C 才不會在轉換後,長度不減反增:
  1. 整個字串只有連續兩個數字連續四個以上的數字。(只有連續三個不行)
  2. 字串開頭為連續四個以上的數字
  3. 字串結尾為連續四個以上的數字
  4. 字串中間為連續六個以上的數字,且前後為其他 Set 的文字時
底下舉出幾個適合使用的狀況:
  • 「99」符合狀況 1
  • 「90975321」符合狀況 1
  • 「1234AB」符合狀況 2
  • 「123456A23」符合狀況2
  • 「88abcd4321」符合狀況3
  • 「AB12345678C」符合狀況4
  • 「ab12345XD」時,中間不轉碼 (四個狀況皆不符合)

沒有留言:

張貼留言