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).