It says:
A QR code contains a mode indicator, character count and the bitstream encoding the characters. Modes are:
- numeric: 10 bits are used for [0-9]{3}
- alphanumeric: 11 bits are used for [0-9A-Z$%+-./:]{2}
- 8 bit Kana/JIS X 0201: (8 bits are used for every Japanese character)
- Kanji
- mixed mode (switching between multiple character sets in one stream)
- extended channel mode (ECI) - latin1, cyrillic, etc
https://www.swisseduc.ch/informatik/theoretische_informatik/...
Note that the document mentions that stuff like 'font size' is not specified in QR (?), while saying nothing about basic questions like 'what about non-printable characters'.
Then it got it got superseeded by 18004:2015. When a person asked on StackOverflow what's going on, the answer by the author of the most popular QR library (zxing) says "There is one (not obsolete) ISO spec for QR codes, ISO 18004:2006. Most of what you observe is just lack of compliance." - https://stackoverflow.com/questions/18699739/tools-for-qr-co...
Looking at other questions ("how do I store utf8"), it seems like scanners do some heuristics (scanning for BOM, valid unicode codepoints, etc), not even slightly conforming to the modes: https://stackoverflow.com/questions/51516612/choosing-a-char...
---
So, you can do base64 with ECI latin1, and risk the scanner performing some heuristic... or you can just take the alphanumeric route with 45 options (26 letters: [A-Z], 10 digits: [0-9] + 9 special characters), which is compact in terms of QR representation (not in terms of modern 8-64 bit words in memory!) and call it a day: https://tools.ietf.org/pdf/draft-faltstrom-base45-06.pdf