One of the things that Data Matrix got right was being able to shift between encoding regimes mid-stream. Many character sets can be represented in radix-40 (so three characters per two bytes), and the occasional capital character can be handled by a shift byte. If you have a long string of digits, they can be encoded in 4 bits/char. You can even put raw binary in there if need be
A QR Code consists of a sequence of segments. Each segment has a mode - numeric, alphanumeric, kanji, or byte. It is possible to shift between encoding regimes by ending a segment and beginning a new segment with a different mode. https://www.nayuki.io/page/optimal-text-segmentation-for-qr-...
tl;dr: Upper case letters can be represented in "alphanumeric" mode, which uses 11 bits per two characters (5.5 bits per character, but padded if the length is uneven). Lower case letters are not included in alphanumeric mode, so the QR code has to be represented in byte mode, which uses 8 bits per character.
One of the things that Data Matrix got right was being able to shift between encoding regimes mid-stream. Many character sets can be represented in radix-40 (so three characters per two bytes), and the occasional capital character can be handled by a shift byte. If you have a long string of digits, they can be encoded in 4 bits/char. You can even put raw binary in there if need be
A QR Code consists of a sequence of segments. Each segment has a mode - numeric, alphanumeric, kanji, or byte. It is possible to shift between encoding regimes by ending a segment and beginning a new segment with a different mode. https://www.nayuki.io/page/optimal-text-segmentation-for-qr-...
Some 1D barcodes have inline shift symbols like you said for Data Matrix, though. e.g. https://en.wikipedia.org/wiki/Code_128
tl;dr: Upper case letters can be represented in "alphanumeric" mode, which uses 11 bits per two characters (5.5 bits per character, but padded if the length is uneven). Lower case letters are not included in alphanumeric mode, so the QR code has to be represented in byte mode, which uses 8 bits per character.