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 [1] )。Code39的几个个优点是,只要增加条码字体,就能够用现有的印刷系统印出条码,因为Code39不需要计算校验位置。[2]而且几乎所有的条码扫描器都能解码。
历史
Code39由Intermec的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]
编码方式
下面显示的“*”字元不是真正的可编码字元,而是开始与终止符号,其不对称性使阅读器可以确定所扫描条形码的方向。这个符号通常会对映到“*”字元,并且会与条码内容一起以人类可读格式印出。
一般来说,两条粗线的位置可以视为对数字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)。而“||▮▮|”的数值为4+7=11表示数字0 。 在对(+10至+30)的字母进行编码时,算式需要添加“ -1”,因此字母“A”的编码为“▮|| |▮”,对应的数值为1+10−1=10。
下表是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条码:
参考文献
- ^ As one example of an international standard, see Identification of postal items – 13-character identifier (PDF). Universal Postal Union. 28 October 2010.[失效链接]
- ^ Google Fonts. Google Fonts. [2019-05-20]. (原始内容存档于2019-10-20).
- ^ Allais, D. C. AIDC Memoirs (PDF). 2006 [2010-06-02]. (原始内容存档 (PDF)于2013-01-26).
- ^ MIL-STD-1189 Standard Department of Defense Barcode Symbology. 1989-08-10 [2010-07-22]. (原始内容存档于2011-07-22).
- ^ Adoption Notice: AIM/BC1 Uniform Symbology Specification. 1997-06-19 [2011-04-06]. (原始内容存档于2011-09-27).
- ^ GNU Barcode. GNU Project. 19 February 2020 [2020-08-25]. (原始内容存档于2020-05-28).