Code 39 (also known as Alpha39, Code 3 of 9, Code 3/9, Type 39, USS Code 39, or USD-3) is a variable length, discrete barcode symbology defined in ISO/IEC 16388:2007.

The Code 39 specification defines 43 characters, consisting of uppercase letters (A through Z), numeric digits (0 through 9) and a number of special characters (-, ., $, /, +, %, and space). An additional character (denoted '*') is used for both start and stop delimiters. Each character is composed of nine elements: five bars and four spaces. Three of the nine elements in each character are wide (binary value 1), and six elements are narrow (binary value 0). The width ratio between narrow and wide is not critical, and may be chosen between 1:2 and 1:3.

The barcode itself does not contain a check digit (in contrast to—for instance—Code 128), but it can be considered self-checking on the grounds that a single erroneously interpreted bar cannot generate another valid character. Possibly the most serious drawback of Code 39 is its low data density: It requires more space to encode data in Code 39 than, for example, in Code 128. This means that very small goods cannot be labeled with a Code 39 based barcode. However, Code 39 is still used by some postal services (although the Universal Postal Union recommends using Code 128 in all cases), and can be decoded with virtually any barcode reader. One advantage of Code 39 is that since there is no need to generate a check digit, it can easily be integrated into an existing printing system by adding a barcode font to the system or printer and then printing the raw data in that font.

Code 39 was developed by Dr. David Allais and Ray Stevens of Intermec in  1974. Their original design included two wide bars and one wide space in each character, resulting in 40 possible characters. Setting aside one of these characters as a start and stop pattern left 39 characters, which was the origin of the name Code 39. Four punctuation characters were later added, using no wide bars and three wide spaces, expanding the character set to 43 characters. Code 39 was later standardised as ANSI MH 10.8 M-1983 and MIL-STD-1189. MIL-STD-1189 has been cancelled and replaced by ANSI/AIM BC1/1995, Uniform Symbology Specification — Code 39.

Encoding 
The * character presented below is not a true encodable character, but is the start and stop symbol for Code 39. The asymmetry of the symbol allows the reader to determine the direction of the barcode being scanned. This code is traditionally mapped to the * character in barcode fonts and will often appear with the human-readable representation alongside the barcode.

As a generality, the location of the two wide bars can be considered to encode a number between 1 and 10, and the location of the wide space (which has four possible positions) can be considered to classify the character into one of four groups (from left to right): Letters(+30) (U–Z), Digits(+0) (1–9,0), Letters(+10) (A–J), and Letters(+20) (K–T).  For example, the letter P (being the 16th letter of the alphabet) has its bars aligned to represent the number 6, and the space in the far right position to select the group Letters(+20).

When represented as a digit, the number "10" is used to encode the number zero.  Because there are only six letters in the Letters(+30) group (letters 30–35, or U–Z), the other four positions in this group (36–39) are used to represent three symbols (dash, period, space) as well as the start/stop character.

The two wide bars, out of five possible positions, encode a number between 1 and 10 using a two-out-of-five code with the following numeric equivalence: 1, 2, 4, 7, 0.  The numbers are summed together.  For example, the number 6 is encoded NWWNN, with wide bars occupying the positions for 2 and 4 (2+4=6).  In the case of NNWWN which is  it is assigned to 0 for digits (+0), and 10 for the letter columns (+10 – +30). When encoding the (+10 to +30) letters the equation needs a "−1" added so 'A' is WNNNW → 1 + 10 − 1 → 10 as shown in the table.

The last four characters consist of all narrow bars and three wide spaces.  There are four possible positions for the single narrow space.

This table outlines the Code 39 specification.  The numeric value assigned to each character (except start/stop) is used in the checksum algorithm described below.

Characters are separated by an additional narrow space. For example, the full encoding for the single letter "A", which actually includes the start and stop characters as "*A*", is . The code will not be read properly without these inter-character spaces. Barcode fonts invariably include this space within the glyph for the character.

Code 39 check digit 
Code 39 is sometimes used with an optional modulo 10 or 43 check digit. Using it requires this feature to be enabled in the barcode reader. The code with check digit is referred to as Code 39 mod 10 or Code 39 mod 43 respectively.

To compute this, each character is assigned a value.  The assignments are listed in the table above, and almost, but not quite, systematic.

Here is how to do the checksum calculation:
 Take the value (0 through 42) of each character in the barcode excluding start and stop codes.
 Sum the values.
 Divide the result by 10 (for Mod 10 check digit) or by 43 (for Mod 43 check digit).
 The remainder is the value of the checksum character to be appended.

Full ASCII Code 39 
Code 39 is restricted to 43 characters. In Full ASCII Code 39 Symbols 0-9, A-Z, ".", "-" and space are the same as their representations in Code 39. Lower case letters, additional punctuation characters and control characters are represented by sequences of two characters of Code 39.

Software

The following free and open source software can produce Code 39 barcodes:

 GNU Barcode.

References

Barcodes

pt:Código de barras#Código 39
코드 39는 가변 길이의 개별 바코드다.

코드 39는 대문자 (A ~ Z), 숫자 (0-9) 및 특수 문자 (-,., $, /, +, % 및 공백 )로, 총 43자로 구성된다.  추가 글자( '*'로 표시됨)는 시작 구분 기호와 종료 구분 문자 모두에 사용된다.  각 문자는 9 개의 요소로 구성된다 : 5 개의 막대와 4 개의 공백. 각 문자의 9 개 요소 중 3 개는 넓고 (2 진 값 1) 6 개 요소는 좁다. (2 진 값 0) 너비와 너비 간의 너비 비율은 중요하지 않으며 1 : 2에서 1 : 3 사이에서 선택할 수 있다.

바코드 자체에는 확인 숫자가 포함되지 않지만 (코드 128과 대조적으로), 잘못 해석된 단일 막대가 다른 유효한 문자를 생성할 수 없다는 이유로 자체 검사로 간주될 수 있다.  코드 39의 가장 심각한 단점은 낮은 데이터 밀도다. 예를 들어 코드 128보다 코드 39에서 데이터를 인코딩하는 데 더 많은 공간이 필요하다. 즉, 아주 작은 제품에는 코드 39 기반 바코드로 레이블을 지정할 수 없다. 그러나, 비록 코드 39는 여전히 몇몇 우편 서비스에 의해 사용된다. (만국 우편 연합은 모든 경우에 코드 (128)를 사용할 것을 권장하고, ) 거의 모든 바코드 리더로 디코드할 수 있다. 코드 39의 장점 중 하나는 체크 디지트를 생성할 필요가 없기 때문에 바코드 글꼴을 시스템이나 프린터에 추가한 다음 해당 글꼴로 데이터를 인쇄하여 기존 인쇄 시스템에 쉽게 통합할 수 있다는 것이다.
Code 39는 1974년 David Allais 와 Intermec의 Ray Stevens가 개발했다. 그들의 원래 디자인은 두 개의 넓은 막대와 각 문자에 하나의 넓은 공간을 포함하여 40 개의 가능한 문자를 만들었다. 이 문자 중 하나를 시작 및 중단 패턴으로 남겨두면 39 자가 남았다. 이 문자는 Code 39라는 이름의 기원이었다.  나중에 4 개의 구두점 문자가 추가되어 넓은 막대와 3 개의 넓은 공백을 사용하지 않고 문자 세트를 43 자로 확장했다.  Code 39는 나중에 ANSI MH 10.8 M-1983 및 MIL-STD-1189로 표준화되었다.  그리고 MIL-STD-1189는 취소되고 ANSI / AIM BC1 / 1995, 통일 기호 표준 - 코드 39로 대체되었다.

인코딩 
아래 표시된 * 문자는 실제 인코딩 가능 문자는 아니지만 코드 39의 시작 및 중지 기호다. 기호의 비대칭성은 판독기로 하여금 스캔되는 바코드의 방향을 결정하게 한다. 이 코드는 전통적으로 바코드 글꼴의 '*' 문자에 매핑되며 바코드와 함께 사람이 읽을 수 있는 표현으로 표시된다.

일반적으로 두 개의 넓은 막대의 위치는 1에서 10 사이의 숫자를 인코딩하는 것으로 간주될 수 있으며 넓은 공간의 위치 (네 개의 가능한 위치가 있음)는 문자를 네 개의 그룹 중 하나로 분류하는 것으로 간주될 수 있습니다 ( 왼쪽에서 오른쪽으로) : 문자 (+30) (U-Z), 숫자 (+0) (1-9,0), 문자 (+10) (A-J) 및 문자 (+20) 티).  예를 들어, 문자 P (알파벳의 16 번째 문자)는 숫자 6을 나타내기 위해 막대가 정렬되어 있고 맨 오른쪽 위치의 공백은 그룹 문자 (+20)를 선택한다.

숫자로 표현 될 때 숫자 "10"은 숫자 0을 인코딩하는 데 사용된다.  왜냐면 문자 (+ 30) 그룹에는 문자가 6 개 (문자 30-35 또는 U-Z)이므로 이 그룹의 나머지 4 개 위치 (36-39)는 대시, 마침표, 공백 )뿐만 아니라 시작 및 정지 문자이기 때문이다.

5 개의 가능한 위치 중 두 개의 넓은 막대는 1, 2, 4, 7, 0의 숫자 동등성을 갖는 2의 5 코드를 사용하여 1에서 10 사이의 숫자를 인코딩한다.  숫자는 합산된다. 예를 들어, 숫자 6은 2와 4 (2 + 4 = 6)의 위치를 차지하는 넓은 막대와 함께 NWWNN으로 인코딩된다.  NNWWN이  경우 숫자 (+0)는 0, 문자 열 (+10 - +30)은 10으로 지정된다.  (+10에서 +30) 글자를 인코딩 할 때 방정식에 "-1"이 필요하므로 표에 표시된 대로 'A'는 WNNNW → 1 + 10-1 → 10이다.

마지막 네 문자는 모든 좁은 막대와 세 개의 넓은 공백으로 구성된다. 좁은 단일 공간에는 4 가지 위치가 있다.

이 표에는 Code 39 사양이 요약되어 있다. 각 문자에 할당된 숫자 값 (시작 및 정지 제외)은 아래 설명된 체크섬(checksum) 알고리즘에서 사용된다.

문자는 좁은 공간으로 구분된다. 예를 들어, 실제로 시작을 포함하고 문자를 중지 단일 문자 "A"의 전체 인코딩 "* A *"이며,  ▮ | | ▮▮ |  이러한 문자 간 스페이스가 없으면 코드를 제대로 읽을 수 없다.  바코드 글꼴은 문자의 글리프 내에 항상 이 공간을 포함한다.

코드 39와 mod 43 
코드 39는 선택적 모듈로 43 체크섬과 함께 사용되기도 한다. 이 기능을 사용하려면 이 기능을 바코드 인식기에서 활성화해야 한다. 체크 숫자가 있는 코드를 코드 39 mod 43 이라고 한다.

이를 계산하기 위해 각 문자에 하나의 값이 할당된다. 할당은 위의 표에 나열되어 있지만 거의 체계적이지는 않다.

다음은 체크섬 계산을 수행하는 방법이다.

 시작 및 종료 코드를 제외한 바코드의 각 문자 값 (0 - 42)을 가져온다.
 값을 합한다.
 결과를 43으로 나눈다.
 나머지는 추가할 체크섬 문자의 값이다.

전체 ASCII 코드 39 
코드 39는 43 자로 제한된다.  전체 ASCII 코드 39 기호 0-9, AZ, ".", "-"및 공백은 코드 39의 해당 표현과 동일하다. 소문자, 추가 구두점 문자 및 제어 문자는 코드 39의 두 문자 시퀀스로 나타낸다.

참고 

바코드