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 As one example of an international standard, see  ）。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〉代替。

 编码方式 
下面显示的「*」字元不是真正的可编码字元，而是開始與終止符號，其不对称性使阅读器可以确定所扫描条形码的方向。這個符號通常會對映到「*」字元，並且會與條碼內容一起以人類可讀格式印出。 
缩略图| 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的符號表。每個字元（除了開始/終止符號）的數值會在下節的校验演算法中使用。
+Code39 字元 (與校驗和)線條寬空格|| |||+0||| ||+10|||| |+20| ||||+30▮|||▮1▮| ||▮11▮|| |▮A10▮||| ▮K20▮ |||▮U30|▮||▮2|▮ ||▮22|▮| |▮B11|▮|| ▮L21| ▮||▮V31▮▮|||3▮▮ |||33▮▮| ||C12▮▮|| |M22▮ ▮|||W32||▮|▮4|| ▮|▮44||▮ |▮D13||▮| ▮N23| |▮|▮X33▮|▮||5▮| ▮||55▮|▮ ||E14▮|▮| |O24▮ |▮||Y34|▮▮||6|▮ ▮||66|▮▮ ||F15|▮▮| |P25| ▮▮||Z35|||▮▮7|| |▮▮77||| ▮▮G16|||▮ ▮Q26| ||▮▮ -36▮||▮|8▮| |▮|88▮|| ▮|H17▮||▮ |R27▮ ||▮|.37|▮|▮|9|▮ |▮|99|▮| ▮|I18|▮|▮ |S28| ▮|▮|␣38||▮▮|10|| ▮▮|00||▮ ▮|J19||▮▮ |T29| |▮▮|*|||||| | | ||$39| | || |/40| || | | +41|| | | |%42
每個字元會用一個窄空格隔開。例如，字母「A」完整编码实际上會加上開始/終止符號，變成「*A*」，對應的條碼為。只要没有这些空格，就无法正确读取條碼，因此條碼字體必須要包含這個窄空格。

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

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

这是校验和的计算方法： 

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

 完整的ASCII Code39 
Code39僅能表示34個字元。在ASCII Code39中，0至9、A至Z、「.」、「,」以及空格的符號與Code39相同。小寫字母、其他標點符號和控制字元則由兩個Code39符號表示。 
編碼表數值  字元  編碼數值  字元  編碼數值  字元  編碼數值  字元  編碼0 NUL  %U32 [space]  [space]64 @  %V96 `  %W1 SOH  $A33 !  /A65 A  A97 a   +A2 STX  $B34 "  /B66 B  B98 b   +B3 ETX  $C35 #  /C67 C  C99 c   +C4 EOT  $D36 $  /D68 D  D100 d   +D5 ENQ  $E37 %  /E69 E  E101 e   +E6 ACK  $F38 &  /F70 F  F102 f   +F7 BEL  $G39 '  /G71 G  G103 g   +G8 BS  $H40 (  /H72 H  H104 h   +H9 HT  $I41 )  /I73 I  I105 i   +I10 LF  $J42 *  /J74 J  J106 j   +J11 VT  $K43  +  /K75 K  K107 k   +K12 FF  $L44 ,  /L76 L  L108 l   +L13 CR  $M45  -   -77 M  M109 m   +M14 SO  $N46 .  .78 N  N110 n   +N15 SI  $O47 /  /O79 O  O111 o   +O16 DLE  $P48 0  080 P  P112 p   +P17 DC1  $Q49 1  181 Q  Q113 q   +Q18 DC2  $R50 2  282 R  R114 r   +R19 DC3  $S51 3  383 S  S115 s   +S20 DC4  $T52 4  484 T  T116 t   +T21 NAK  $U53 5  585 U  U117 u   +U22 SYN  $V54 6  686 V  V118 v   +V23 ETB  $W55 7  787 W  W119 w   +W24 CAN  $X56 8  888 X  X120 x   +X25 EM  $Y57 9  989 Y  Y121 y   +Y26 SUB  $Z58 :  /Z90 Z  Z122 z   +Z27 ESC  %A59 ;  %F91 [  %K123 {  %P28 FS  %B60 <  %G92 \  %L124 |  %Q29 GS  %C61 =  %H93 ]  %M125  }  %R30 RS  %D62 >  %I94 ^  %N126 ~  %S31 US  %E63 ?  %J95 _  %O127 DEL  %T, %X, %Y, %Z

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

 GNUBarcode  
 gLabels
 Libre Barcode Project 

 参考文献 

Category:條碼