双重音大写字母(例如 ÙÇ、ÙÉ、ÀÇ 和 ÈÏ)在二维码中无法很好地解码。有办法解决这个问题吗?
\documentclass[french]{article}
\usepackage{fontspec} % if this package is not present, the accented text outside the qrcode disappear
\usepackage{babel}
\usepackage[forget]{qrcode}
\begin{document}
The following qrcodes work well: \\[20pt]
À \qrcode[]{À} ~~
É \qrcode[]{É} ~~
Ù \qrcode[]{Ù} ~~
Ç \qrcode[]{Ç} \\[20pt]
È \qrcode[]{È} ~~
Ï \qrcode[]{Ï} ~~
ÀÉ \qrcode[]{AÉ} ~~
Ù Ç \qrcode[]{Ù\ Ç} \\[20pt]
àçéùï \qrcode[]{àçéùï}\\[20pt]
The accented characters are not well decoded in the following qrcodes:\\[20pt]
ÙÇ \qrcode[]{ÙÇ} ~~
ÙÉ \qrcode[]{ÙÉ} ~~
ÀÇ \qrcode[]{ÀÇ} ~~
ÈÏ \qrcode[]{ÈÏ} \\[20pt]
ÀÉÙÇ \qrcode[]{ÀÉÙÇ} ~~
àùéèçïÀÉÙÇÈÏ \qrcode[]{àùéèçïÀÉÙÇÈÏ}
\newpage
The following qrcodes work well when the Accented Capital Letters are separated by a space: \\[20pt]
Ù Ç \qrcode[]{Ù\ Ç} ~~
Ù É \qrcode[]{Ù\ É} ~~
À Ç \qrcode[]{À\ Ç} ~~
È Ï \qrcode[]{È\ Ï} \\[20pt]
À É Ù Ç \qrcode[]{À\ É\ Ù\ Ç}\\[20pt]
The following qrcode translates (?) into asian characters when the Accented Capital Letters are separated by a space: \\[20pt]
àùéèçï À É Ù Ç È Ï \qrcode[]{àùéèçï\ À\ É\ Ù\ Ç\ È\ Ï}
\end{document}
答案1
正如我在评论中提到的,QR 码不直接支持 Unicode。并且包的实现qrcode
使用以下几行将字符转换为数字:
\def\qr@encode@ascii@recursive(#1,#2#3){% % #1 = hex codes translated so far % #2 = next plaintext character to translate % #3 = remainder of plaintext \edef\qr@testii{#2}% \ifx\qr@testii\qr@relax% % All done! \g@addto@macro\qr@codetext{#1}% \else% % Another character to translate. \edef\qr@asciicode{\number`#2}% \qr@decimaltohex[2]{\qr@newhexcodes}{\qr@asciicode}% \edef\qr@argument{(#1\qr@newhexcodes,#3)}% %\show\qr@argument \xa\qr@encode@ascii@recursive\qr@argument% \fi% }%
正如您所看到的,\number`#2
这是一个宏,
- 发送
A
至41
- 发送
É
至c9
- 发送
Ù
至d9
- 发送
Ç
至c7
- 等等...
效果qrcode
好吗?
几乎可以。这些字符被转换成相应的数字,从而产生良好的二维码图像。
例如,原始数据ÙÇ
是
40 2d 9c 70 ec 11 ec 11 ec
在哪里
4
方法字节编码(每个字符 8 位);02
表示有三个字符;d9
是Ù
;并且c7
是Ç
。
如果是Ù Ç
,原始数据是
40 3d 92 0c 70 ec 11 ec 11
在哪里
4
方法字节编码(每个字符 8 位);03
表示有两个字符;d9
是Ù
;20
是空间;并且c7
是Ç
。
那么,出了什么问题?
解码时,事情变得复杂起来。结果发现,解码器识别d920c7
= ,Ù Ç
但不能识别d9c7
= ÙÇ
。我无法解释这一点。最后一种情况更有趣:
41 2e 0f 9e 9e 8e 7e f2 0c 02 0c 92 0d 92 0c 72 0c 82 0c f0 ec 11
第一个可识别的字符e0f9
是瓊
Shift JIS,这是 QR 码支持的编码。因此解码器将转换为 Shift JIS 并输出瓊鳧鉐 タ ノ ル ヌ ネ マ
结果。
但为什么ÀÉ
表现得好?
不,不是。原始数据是
40 24 1c 90 ec 11 ec 11 ec
但事实AÉ
并非如此ÀÉ
。
如何解决?
首先,如果你要对法语进行编码,那么像Œ
,œ
以及非常罕见的Ÿ
可能会导致失败。您可能需要重写上面提到的宏。
否则,如果您对 ASCII 感到满意,则需要强制解码器读取 0xFF=127 之后的字符。这与 TeX 无关。