選單

EAN 與 UPC 條碼校驗位:商品條碼怎麼算最後一位

商品條碼的最後一位是校驗位,做法是按交替權重加權求和、再對模數取補數。本文說明權重起點為什麼隨長度改變、前綴在說什麼與不說什麼,以及為什麼校驗通過與商品真偽無關。

發佈於

  • 條碼
  • 校驗位

收銀台掃一下就知道價格,靠的是條碼裡的一串數字;而這串數字的最後一位,其實是前面那些位算出來的校驗位。本文說明商品條碼校驗位是怎麼來的、權重為什麼隨長度改變、條碼前綴在說什麼與不說什麼,以及為什麼掃得出來與是不是正品完全是兩件事。

商品條碼的最後一位是怎麼來的?

商品條碼的數字部分,最後一位是校驗位。它的產生方式是把前面的位依交替的權重相乘後相加,再對一個模數取補數,把結果當成最後一位。整個過程不需要查詢任何資料庫,也不需要連線。

這個設計的目的很明確:擋住抄錄與掃描的疏失。少掃一位、多掃一位、相鄰兩件商品的條碼串在一起,都會讓重新算出來的校驗位與原本的最後一位對不上,系統就能當場發現。

要注意的是它與防偽無關。任何知道規則的人都能替任意前綴算出合法的校驗位,所以「校驗位成立」只能證明這串數字自洽,不能證明這件商品是真品。

這也解釋了為什麼仿製條碼幾乎不需要技術門檻。真正的防線不在這串數字裡,而在供應鏈與通路的紀錄上;條碼只是一把讓機器快速讀到號碼的鑰匙,它本身不攜帶任何憑證。

兩種常見長度與權重起點

條碼體系裡常見的有兩種長度,名稱分別是 EAN-13 與 UPC-A。它們的數字位數不同,而權重的起點也不一樣:同一套交替權重,從左邊數起或從右邊數起,得到的是完全不同的兩組位置。

體系 名稱的性質 權重安排 站位起點
EAN-13 標準名稱本身 兩組權重交替 依該體系的規定
UPC-A 標準名稱本身 兩組權重交替 依該體系的規定

名字裡的數字屬於標準名稱的一部分,不是本文要你背下來的參數。真正要記住的是原則:權重起點與長度綁定,因此把某一種長度的實作直接套到另一種長度上,算出來的結果必然錯誤,而且錯得很難察覺,因為它看起來仍然是一個合法位數的數字。

實作上的建議是把「長度」與「權重起點」放在同一筆設定裡,讓長度決定起點,而不是讓呼叫端自己記得傳對參數。

從右往左加權的算法思路

交替權重最常以從右往左的方式描述:從校驗位左邊那一位開始,依序套用兩個不同的權重,週期為二。這種描述方式的好處是不受長度奇偶影響,起點永遠是固定的那一位。

另一個常見的描述方式是從左往右,但那樣就必須先知道總長度,才能決定第一個位置套用哪一個權重。兩種描述等價,只是其中一種比較不容易在實作時寫錯。

取補數這一步也常被誤解。它的目的是讓整串數字(含校驗位)的加權總和能被模數整除,所以校驗位不是餘數本身,而是模數減去餘數的結果。少做這一步,通過與不通過的判斷就會整個反過來。

還有一個細節是位數不足的情況。若輸入的長度不符,先前的加權就不再對應到正確的位置,算出來的結果雖然仍是某個數字,卻沒有任何意義。因此長度檢查必須排在算法之前,不能等到結果看起來不合理才回頭補。

條碼前綴在說什麼、不說什麼

條碼最前面的幾位是由條碼標準組織分配給國家或地區的號段。它說明的是號段的歸屬,也就是這個廠商識別碼是在哪一個體系下核發的。

它不說明生產地。一件商品可以在任何地方生產,只要它的號段是由某個體系核發的,前綴就會顯示那個體系所屬的地區。把前綴當成產地證明,是最常見的誤讀之一。

同樣地,前綴也不能用來說明品牌或品質。號段是由不同層級逐級分配下來的,廠商段與商品段各有自己的分配單位,段位調整時同一個商品也可能出現兩個號碼。

實務上還有一種常見的誤解,是把前綴當成價格或分類的線索。前綴不攜帶這些資訊,價格與分類都存在通路的資料庫裡,而那個資料庫與條碼本身的數字之間沒有數學關係。

校驗通過就能掃得出來嗎?

不能。校驗通過只代表這串數字自洽,與它有沒有被實際指派、能不能被收銀系統查到價格,是完全不同的問題。資料庫裡沒有這筆號段,掃描器照樣讀得出數字,只是查不到對應的商品。

反過來,掃不出來也未必是號碼有問題。標籤印刷品質、掃描角度、光線與條碼被遮損,都會讓掃描失敗。這也是為什麼掃描失敗時,第一步該懷疑的是掃描條件與輸入,而不是直接判定號碼造假。

在校驗失敗的情況下,排查順序建議是:先確認是否少掃或多掃了位數,再確認是否掃到了相鄰的另一個條碼,最後才懷疑號碼本身。順序顛倒會浪費很多時間。

還有一個情形值得單獨列出來:條碼被部分遮損時,掃描器可能讀出一個長度正確但內容有誤的字串。這種情況通常會在重新掃描後消失,但若沒有記錄重掃次數,資料裡就會留下一筆看似正常的錯誤值。

給開發者:批次掃描與錯誤定位

批次處理條碼資料時,最容易出問題的不是算法,而是輸入品質與錯誤定位方式。幾個實務要點:

  • 掃描結果要連同來源一起記錄,例如哪一台裝置、第幾筆,否則事後無法回查。
  • 校驗失敗的紀錄要保留原始字串,只留長度或摘要值沒辦法修資料。
  • 長度不符與校驗位不成立要分開統計,兩者的處理路徑不同。
  • 同一批資料裡若出現重複的號段,通常代表掃描重複,不一定是資料錯誤。
  • 掃描時間與操作人員要一起記錄,否則無法區分資料錯誤與操作重複。

若同一批資料來自多台裝置,建議讓每台裝置的輸出各自成一份檔案,再集中處理。混在一起寫入時,若中途有一台失敗,你很難判斷哪些紀錄是完整的、哪些不是。

如果你想看同一家族在不同參數下的比較,可以讀校驗位演算法家族;卡號那一類的體系用的是另一組參數,寫在Luhn 演算法怎麼算。

下一步

拿幾組明顯是構造值的示範條碼,先自己算一次最後一位,再開號碼校驗工具比對結果。接著檢查你的匯入流程有沒有把掃描裝置與批次資訊一起留下來,因為那決定了事後能不能定位問題。書號與刊號的校驗位走的是另一條線,整理在ISBN 與 ISSN 校驗位。

示例條碼是為了說明最後一位的由來而造出來的,不對應任何實際商品;校驗位成立與商品是不是正品、是否為該品牌的授權產品毫無關係。

繼續閱讀

卡號與身分證號校驗工具相關文章