Code39

Code39（也稱為Alpha39、Code 3 of 9、Code3/9、Type 39、USS Code39或USD-3）是 ISO/IEC 16388:2007 中定義的一種不固定長度的條碼。可以表示43个字元，包含大寫拉丁字母（A到Z）、数字（0到9）和幾個特殊字元（-、.、$，/、+、％與空格）。另有一個外加符號作為終止符號（標示為「*」）。每个字元由九个部份组成：五條線與和四個空格，當中三個部份較寬（二進位1），六個較窄。窄与宽之间的比例并不重要，在1:2和1:3之間都可。

性質 

Code39本身不包含校验位（与Code 128不同），但是由于单點错误不會對應到另一個有效的編碼，因此可以算是自我校驗碼。Code39的最严重缺点可能是其数据密度低，與Code 128相比需要更多空間。這表示小型商品不易使用Code39條碼。但是，某些郵政系統仍然使用Code39（尽管萬國郵政聯盟建议在所有情况下都使用Code 128  ）。Code39的幾個个优点是，只要增加條碼字體，就能夠用現有的印刷系統印出條碼，因為Code39不需要計算校驗位置。而且幾乎所有的條碼掃描器都能解碼。

歷史 

Code39由的與Ray Stevens在1974年開發。原始设计是使用兩條粗線與一個寬空格來表示一個字元，總共可以表示40個符號。再保留其中一個作為開始與終止符號，剩下39個符號，這也是Code39的名稱来源。之後加入了四个标点符号，並排除粗線與三格寬的空格的編碼，將字元集扩展为43个字元。Code39被标准化为ANSI MH 10.8 M-1983和MIL-STD-1189。後者已被取消，并由ANSI/AIM BC1/1995〈Uniform Symbology Specification — Code39〉代替。

编码方式 
下面显示的「*」字元不是真正的可编码字元，而是開始與終止符號，其不对称性使阅读器可以确定所扫描条形码的方向。這個符號通常會對映到「*」字元，並且會與條碼內容一起以人類可讀格式印出。 

一般來說，兩條粗線的位置可以視為對數字1至10編碼；而宽空格的位置（具有四个可能）可视为将字元分为四組（从左到右）： 

  「字母（+30）」：U至Z 
  「数字（+0）」：1至9與0 
  「字母（+10）」：A至J 
  「字母（+20）」：K至T 
最後剩下的四个字元只由細線、三個寬空格與一格窄空格组成。窄空格有四個可能的位置。

例如，字母P（第16個字母）的粗線位置與數字6相同，寬空格則放在「字母（+20）」的位置。 

在表示数字时，0會用「數字（+0）」的「10」表示。另外因為「字母（+30）」组中只有六个字母（U至Z），因此该组中的其他四个位置（36至39）用於表示「-」、「.」、空格以及開始/終止符號。 

兩條粗線則用五個可能的位置使用（每一位分別表示1、2、4、7或0）表示1到10之间的数字。例如数字6被编码为「|▮▮||」，粗線位在2和4的位置（2+4=6）。而「||▮▮|」的數值為表示數字0 。 在对（+10至+30）的字母进行编码时，算式需要添加「 -1」，因此字母「A」的編碼為「▮|| |▮」，對應的數值為1+10−1=10。 

下表是Code39的符號表。每個字元（除了開始/終止符號）的數值會在下節的校验演算法中使用。 

每個字元會用一個窄空格隔開。例如，字母「A」完整编码实际上會加上開始/終止符號，變成「*A*」，對應的條碼為。只要没有这些空格，就无法正确读取條碼，因此條碼字體必須要包含這個窄空格。

Code39 mod 43 
Code39有時會加上模43的校验位。這個功能需要在另外在讀取器中開啟。加上校验位的條碼称为「Code39 mod 43」 。 

每個字元都被分配到一個數值。可以參考上表。 

这是校验和的计算方法： 

 計算條碼中所有字元（除了開始/終止符號）的數值總和 
 將結果除以43 
 餘數即為校验和字元的數值

完整的ASCII Code39 
Code39僅能表示34個字元。在ASCII Code39中，0至9、A至Z、「.」、「,」以及空格的符號與Code39相同。小寫字母、其他標點符號和控制字元則由兩個Code39符號表示。

軟體 
下列自由與開源的軟體可以產生Code39條碼： 

 GNUBarcode  
 gLabels
 Libre Barcode Project

参考文献 

條碼