为什么带重音符号的大写字母在 QRCODE 中无法很好解码?

为什么带重音符号的大写字母在 QRCODE 中无法很好解码?

双重音大写字母(例如 ÙÇ、ÙÉ、ÀÇ 和 ÈÏ)在二维码中无法很好地解码。有办法解决这个问题吗?

\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这是一个宏,

  • 发送A41
  • 发送Éc9
  • 发送Ùd9
  • 发送Çc7
  • 等等...

效果qrcode好吗?

几乎可以。这些字符被转换成相应的数字,从而产生良好的二维码图像。

例如,原始数据ÙÇ

40 2d 9c 70 ec 11 ec 11   ec

在哪里

如果是Ù Ç,原始数据是

40 3d 92 0c 70 ec 11 ec   11

在哪里

那么,出了什么问题?

解码时,事情变得复杂起来。结果发现,解码器识别d920c7= ,Ù Ç但不能识别d9c7= ÙÇ。我无法解释这一点。最后一种情况更有趣:

41 2e 0f 9e 9e 8e 7e f2   0c 02 0c 92 0d 92 0c 72   0c 82 0c f0 ec 11 

第一个可识别的字符e0f9Shift JIS,这是 QR 码支持的编码。因此解码器将转换为 Shift JIS 并输出瓊鳧鉐 タ ノ ル ヌ ネ マ结果。

但为什么ÀÉ表现得好?

不,不是。原始数据是

40 24 1c 90 ec 11 ec 11   ec 

但事实并非如此ÀÉ

如何解决?

首先,如果你要对法语进行编码,那么像Œœ以及非常罕见的Ÿ可能会导致失败。您可能需要重写上面提到的宏。

否则,如果您对 ASCII 感到满意,则需要强制解码器读取 0xFF=127 之后的字符。这与 TeX 无关。

相关内容