Self-checking, and what that actually buys you
Each CODE 39 character is nine elements, three of them wide, and that fixed structure is checked as the scanner decodes. A printing defect that alters one element produces an invalid pattern rather than a different valid character, so the symbol fails to read instead of reading wrong.
That is a meaningful safety property in an environment where labels get printed on worn thermal printers and read in poor conditions. It is not the same as a check digit covering the whole message, though: an optional modulo-43 check character exists for that, required by some specifications and ignored by most general use.
Why it is so wide
Every character takes the same nine elements regardless of what it is, and there is no numeric compression of the kind CODE 128's subset C provides. A twelve-character part number can therefore run half as wide again as the same string in CODE 128.
On a large carton that is irrelevant. On a small component label or a cable flag it is the deciding constraint, and it is the usual reason a legacy scheme gets migrated. Full ASCII CODE 39, which encodes lowercase and symbols as two-character sequences, roughly doubles the width again — a workaround rather than a feature.
The asterisks and the character set
The symbol is delimited by an asterisk at each end. Most software adds these automatically, and this generator does; the confusion arises when a system prints the human-readable line as *PART-1234* and someone types the asterisks into a field expecting the bare value.
The character set is uppercase only. Lowercase input is a common source of failure — it either gets silently uppercased or rejected, depending on the encoder. If your identifiers are case-sensitive, CODE 39 cannot represent them and the choice is already made for you.
When a specification is the reason
Choose CODE 39 when something external requires it: a customer's inbound labelling standard, a defence contract citing MIL-STD-129, an existing scanner fleet configured for it, or a database of historical labels that must stay readable alongside new ones.
For anything genuinely new and internal, CODE 128 is denser, supports lowercase and carries a proper check character. The exception is where labels may be read by very old or oddly configured equipment you do not control — CODE 39's universality is its last real advantage, and occasionally it is the one that matters.