我见过的二维码大多是图像文件。但是你能用纯文本创建二维码吗?
例如 ASCII 和 UTF-8 都有黑框作为字符。我可以将它们与空格一起使用来创建二维码吗?
答案1
是的!有一个名为qrencode
它可以为您呈现这些内容。
对于二维码来说,唯一真正重要的因素是二维阵列具有“更暗“ 和 ”打火机“像素/段。它也可以是彩色的,尽管对比度可能开始成为一个问题。
ASCII
您读取此二维码的能力可能取决于相机的分辨率、距离和您使用的软件。
qrencode -t ASCIIi 'https://superuser.com/questions/1420001/is-it-possible-to-write-a-qr-code'
注意:我使用-t ASCIIi
(反转 ASCII),因为我的终端是黑底白字。
美国国家标准
此模式通过将背景颜色设置为黑色或白色,并打印一定数量的空格字符来实现。
qrencode -t ANSI 'https://superuser.com/questions/1420001/is-it-possible-to-write-a-qr-code'
写入终端的一些原始字符如下所示,这些是ANSI 转义代码。 一个 ”逃脱“字符的值为0x1b
,通常可以写成\e
。
\e[40m
将背景颜色设置为黑色\e[47m
将背景颜色设置为白色0x20
是 ASCII 空格
UTF-8
还有 UTF-8 模式 ( -t UTF8
)。此模式使用“半块“字符来增加密度,并将行数减少一半。
- ▀ - U+2580 / 上半块
- ▄ - U+2584 / 下半块
- █ - U+2588 / 全块
来自@grawity 的截图(感谢)
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'
答案2
Attie 的回答qrencode
很棒,但由于某种原因,它总是输出带有反转颜色的二维码,而我的条形码扫描仪应用程序无法读取。
反转 UTF-8 输出绝非易事,所以我想把它留在这里供其他人使用;)
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}"
我使用这个以便我可以使用二维码对 utf-8 纯文本消息进行加密签名并以 html 格式将其显示在我的网站上。
为了实现这一点,并且不让 html 因行距而破坏二维码的可读性,我将二维码放在<pre>
具有 CSS 样式的块内,如下所示:
<pre style="line-height:1em; letter-spacing: -1px; font-size: x-large;">
...
</pre>
有关实例,请参阅