129

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?

Giacomo1968
  • 53,069
  • 19
  • 162
  • 212
MCK
  • 1,155
  • 3
  • 9
  • 11
  • 7
    Is there a specific project this is for? I'm just curious – Ky - Apr 02 '19 at 03:35
  • 6
    @BenLeggiero Thank you for your question. I don't have a certain project but I thought it would be handy to know the existence of such QR codes. For example, you can put those in a bio on a forum if the forum doesn't support profile pictures, and many more advantages. – MCK Apr 02 '19 at 10:19
  • At a small enough font size, you don't even need the black boxes! – Paul D. Waite Apr 03 '19 at 16:27

2 Answers2

186

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 'https://superuser.com/questions/1420001/is-it-possible-to-write-a-qr-code'

Note: I used -t ASCIIi (Inverted ASCII) because my terminal is White-on-Black.

ASCII QR Code

ANSI

This mode works by setting the background color to black or white, and printing a number of space characters.

qrencode -t ANSI 'https://superuser.com/questions/1420001/is-it-possible-to-write-a-qr-code'

ANSI QR Code

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[40m sets the background color to black
  • \e[47m sets the background color to white
  • 0x20 is an ASCII space

ANSI QR Code Raw

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 'https://superuser.com/questions/1420001/is-it-possible-to-write-a-qr-code'
qrencode -t ANSIUTF8 'https://superuser.com/questions/1420001/is-it-possible-to-write-a-qr-code'

UTF-8 QR Code

Attie
  • 19,231
  • 5
  • 58
  • 73
  • 4
    Don't forget `-t UTF-8` mode, which uses the "box drawings" characters that OP mentions? – u1686_grawity Apr 01 '19 at 15:00
  • 9
    https://i.imgur.com/WQYkxYm.png https://i.imgur.com/KeDVJ16.png – this uses "half block" characters `▄` `▀` `█`, with optional colors to increase contrast only. (They're from Unicode 1.1 and date all the way to IBM DOS; surprised there's still any terminal that cannot render those...) – u1686_grawity Apr 01 '19 at 15:04
  • PuTTY 0.71 on Windows 10 with Consolas works well. Either recent Windows versions improved the Consolas font significantly, or recent PuTTY releases improved its "fallback font" behavior, or both. – u1686_grawity Apr 01 '19 at 15:14
  • Hi, thank you for answering! I know how to work with a console, however will this work on windows? Also is there an installer? The one I found only has a gui with restricted feautures. I'm not amazing in computers, sorry. – MCK Apr 01 '19 at 15:28
  • 1
    No problem! It should work on Windows.. the [project page](https://fukuchi.org/works/qrencode/) mentions a [Win32 port](https://code.google.com/archive/p/qrencode-win32/), that has an [installer available for download](https://code.google.com/archive/p/qrencode-win32/wikis/Downloads.wiki)... it looks like it was last updated in Feb 2015. – Attie Apr 01 '19 at 20:57
  • @grawity Mine doesn't render well aswell. Only ASCII works for me. Is it because windows terminals are restricted for all characters? Powershell and CMD don't work. – MCK Apr 02 '19 at 11:30
  • I can't edit my comment anymore so I put it here. Git bash works fine now! – MCK Apr 02 '19 at 11:36
  • 7
    @MuratKaçiran: Powershell and CMD are just command interpreters (shells), they both use the same "Windows Console" as the terminal. It too has received significant improvements in Win10.18xx. In the past, it did not support UTF-8 at all. It could do Unicode via UTF-16 with suitably written programs, but those programs had to deliberately use the special Unicode mode. If the program didn't do that, all you get is the MS-DOS era cp437 codepages... In that situation, `qrencode -t UTF8 | iconv -f utf8 -t cp437` may still work, as the same box drawings also existed back then. – u1686_grawity Apr 02 '19 at 11:46
  • Also curious, why does `-t UTF8` generate a slightly different image from the others? The top two rows are mostly inverted, with slight differences on the right – phflack Apr 03 '19 at 13:36
  • 1
    Good question... this doesn't happen for me when running the command again... Differences visible [here](https://i.stack.imgur.com/Wb3HQ.png). Additionally the black pixels in the [top left](https://i.stack.imgur.com/t5TTq.png) mean that the QR code is [technically invalid](https://en.wikipedia.org/wiki/File:QR_Ver3_Codeword_Ordering.svg)... the fact that they both scan and the same data is extracted shows the robustness of a QR code. – Attie Apr 03 '19 at 14:23
  • 7
    To my surprise, the QR reader app on my iphone successfully read all these off my screen, including the ASCII `#` one. +1. – Digital Trauma Apr 03 '19 at 17:10
  • 3
    @Attie: Oh, I probably had accidentally selected some text so it shows part of the line in reverse-text. – u1686_grawity Apr 04 '19 at 10:30
1

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  "https://superuser.com/q/1420001/551559"`
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 style="line-height:1em; letter-spacing: -1px; font-size: x-large;">
...
</pre>

For a live example, see

Michael Altfield
  • 1,270
  • 1
  • 11
  • 24
  • qrencode 4.0.2 has an (undocumented) `-t UTF8i` type that inverts the Unicode half-blocks for use with a light terminal background – Ingo Karkat Apr 23 '23 at 20:03