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)用于表示“-”、“.”、空格以及开始/终止符号。

两条粗线则用五个可能的位置使用五取二码(每一位分别表示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).