Is it possible to create a QR code using text?
Andrew Henderson
QR codes I have seen are mostly image files. But can you create QR codes using plain text?
For example ASCII and UTF-8 have black boxes as characters. Can I use those together with spaces to create a QR code?
32 Answers
Yes! There is a utility called qrencode that can render these for you.
The only really important factor for a QR code is that the 2D array has "darker" and "ligher" pixels / segments. It can be colored too, though contrast can start to be an issue.
ASCII
Your ability to read this QR code will likely depend on the camera's resolution, distance, and the software you're using.
qrencode -t ASCIIi 'Note: I used -t ASCIIi (Inverted ASCII) because my terminal is White-on-Black.
ANSI
This mode works by setting the background color to black or white, and printing a number of space characters.
qrencode -t ANSI 'Some of the raw characters written to the terminal are shown below, these are ANSI escape codes. An "escape" character has a value of 0x1b and can often be written as \e.
\e[40msets the background color to black\e[47msets the background color to white0x20is an ASCII space
UTF-8
There is also a UTF-8 mode (-t UTF8). This mode uses the "half block" characters to increase the density, and cut the line count by half.
- ▀ - U+2580 / Upper Half Block
- ▄ - U+2584 / Lower Half Block
- █ - U+2588 / Full Block
Screenshot from @grawity (thanks)
qrencode -t UTF8 '
qrencode -t ANSIUTF8 ' 12 Attie's answer with qrencode is great, but for some reason it always outputs a qr code with inverted colors that my Barcode Scanner app can't read.
Inverting the UTF-8 output is hardly trivial, so I thought I'd leave it here for others ;)
qrencode=`qrencode -t UTF8 ""`
echo "${qrencode}"
# replace black
qrencode=$(echo "${qrencode}" | sed s/`echo -e '\xe2\x96\x88'`/A/g)
echo "${qrencode}"
# replace white
qrencode=$(echo "${qrencode}" | sed s/\ /B/g)
echo "${qrencode}"
# swap black for white
qrencode=$(echo "${qrencode}" | sed s/A/\ /g)
echo "${qrencode}"
# swap white for black
qrencode=$(echo "${qrencode}" | sed s/B/`echo -e '\xe2\x96\x88'`/g)
echo "${qrencode}"
# replace "Upper Half Block"
qrencode=$(echo "${qrencode}" | sed s/`echo -e '\xe2\x96\x80'`/A/g)
echo "${qrencode}"
# replace "Lower Half Block"
qrencode=$(echo "${qrencode}" | sed s/`echo -e '\xe2\x96\x84'`/B/g)
echo "${qrencode}"
# swap upper for lower
qrencode=$(echo "${qrencode}" | sed s/A/`echo -e '\xe2\x96\x84'`/g)
echo "${qrencode}"
# swap lower for upper
qrencode=$(echo "${qrencode}" | sed s/B/`echo -e '\xe2\x96\x80'`/g)
echo "${qrencode}"I use this so that I can cryptographically sign a utf-8 plaintext message with a qr-code and display it on my website in html.
To achieve this without html breaking the qr code readability with line spacing, I put the qr code inside of a <pre> block with css styles as follows:
<pre>
...
</pre>For a live example, see