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

「*WIKIPEDIA*」的 Code39 條碼

性質 编辑

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

歷史 编辑

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

编码方式 编辑

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

 
Code39的字元

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

  1. 「字母(+30)」:U至Z
  2. 「数字(+0)」:1至9與0
  3. 「字母(+10)」:A至J
  4. 「字母(+20)」:K至T

最後剩下的四个字元只由細線、三個寬空格與一格窄空格组成。窄空格有四個可能的位置。

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

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

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

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

Code39 字元 (與校驗和)
線條 寬空格
|| ||| +0 ||| || +10 |||| | +20 | |||| +30
▮|||▮ 1 ▮| ||▮ 1 1 ▮|| |▮ A 10 ▮||| ▮ K 20 ▮ |||▮ U 30
|▮||▮ 2 |▮ ||▮ 2 2 |▮| |▮ B 11 |▮|| ▮ L 21 | ▮||▮ V 31
▮▮||| 3 ▮▮ ||| 3 3 ▮▮| || C 12 ▮▮|| | M 22 ▮ ▮||| W 32
||▮|▮ 4 || ▮|▮ 4 4 ||▮ |▮ D 13 ||▮| ▮ N 23 | |▮|▮ X 33
▮|▮|| 5 ▮| ▮|| 5 5 ▮|▮ || E 14 ▮|▮| | O 24 ▮ |▮|| Y 34
|▮▮|| 6 |▮ ▮|| 6 6 |▮▮ || F 15 |▮▮| | P 25 | ▮▮|| Z 35
|||▮▮ 7 || |▮▮ 7 7 ||| ▮▮ G 16 |||▮ ▮ Q 26 | ||▮▮ - 36
▮||▮| 8 ▮| |▮| 8 8 ▮|| ▮| H 17 ▮||▮ | R 27 ▮ ||▮| . 37
|▮|▮| 9 |▮ |▮| 9 9 |▮| ▮| I 18 |▮|▮ | S 28 | ▮|▮| 38
||▮▮| 10 || ▮▮| 0 0 ||▮ ▮| J 19 ||▮▮ | T 29 | |▮▮| *
||||| | | | || $ 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 %U 32 [space] [space] 64 @ %V 96 ` %W
1 SOH $A 33 ! /A 65 A A 97 a +A
2 STX $B 34 " /B 66 B B 98 b +B
3 ETX $C 35 # /C 67 C C 99 c +C
4 EOT $D 36 $ /D 68 D D 100 d +D
5 ENQ $E 37 % /E 69 E E 101 e +E
6 ACK $F 38 & /F 70 F F 102 f +F
7 BEL $G 39 ' /G 71 G G 103 g +G
8 BS $H 40 ( /H 72 H H 104 h +H
9 HT $I 41 ) /I 73 I I 105 i +I
10 LF $J 42 * /J 74 J J 106 j +J
11 VT $K 43 + /K 75 K K 107 k +K
12 FF $L 44 , /L 76 L L 108 l +L
13 CR $M 45 - - 77 M M 109 m +M
14 SO $N 46 . . 78 N N 110 n +N
15 SI $O 47 / /O 79 O O 111 o +O
16 DLE $P 48 0 0 80 P P 112 p +P
17 DC1 $Q 49 1 1 81 Q Q 113 q +Q
18 DC2 $R 50 2 2 82 R R 114 r +R
19 DC3 $S 51 3 3 83 S S 115 s +S
20 DC4 $T 52 4 4 84 T T 116 t +T
21 NAK $U 53 5 5 85 U U 117 u +U
22 SYN $V 54 6 6 86 V V 118 v +V
23 ETB $W 55 7 7 87 W W 119 w +W
24 CAN $X 56 8 8 88 X X 120 x +X
25 EM $Y 57 9 9 89 Y Y 121 y +Y
26 SUB $Z 58 : /Z 90 Z Z 122 z +Z
27 ESC %A 59 ; %F 91 [ %K 123 { %P
28 FS %B 60 < %G 92 \ %L 124 | %Q
29 GS %C 61 = %H 93 ] %M 125 } %R
30 RS %D 62 > %I 94 ^ %N 126 ~ %S
31 US %E 63 ? %J 95 _ %O 127 DEL %T, %X, %Y, %Z

軟體 编辑

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

参考文献 编辑

  1. ^ As one example of an international standard, see Identification of postal items – 13-character identifier (PDF). Universal Postal Union. 28 October 2010. [失效連結]
  2. ^ Google Fonts. Google Fonts. [2019-05-20]. (原始内容存档于2019-10-20). 
  3. ^ Allais, D. C. AIDC Memoirs (PDF). 2006 [2010-06-02]. (原始内容存档 (PDF)于2013-01-26). 
  4. ^ MIL-STD-1189 Standard Department of Defense Barcode Symbology. 1989-08-10 [2010-07-22]. (原始内容存档于2011-07-22). 
  5. ^ Adoption Notice: AIM/BC1 Uniform Symbology Specification. 1997-06-19 [2011-04-06]. (原始内容存档于2011-09-27). 
  6. ^ GNU Barcode. GNU Project. 19 February 2020 [2020-08-25]. (原始内容存档于2020-05-28).