12:45:50
icon

やる気が出なかったので午前中は転がってた :blobtanuki_utouto:

12:50:03
icon

commons.wikimedia.org/wiki/Fil

Wikipedia の本文には「独自研究」を書けないが、画像として載せるなら大体何でもありという性質がよく表れてると思う 🙄

Web site image
File:QRCode-1-Intro.png - Wikimedia Commons
17:53:31 19:21:18
icon

QR‐コードには「数字モード」など幾つかの符号化方式が用意されてる。そのうち「漢字モード」は JIS X 0208 の文字だけを 13 ビットに効率的に格納する設計なのが興味深い。(変換に Shift JIS を挟むけど、一バイト文字の領域を捨てるから、文字集合としては JIS X 0208 そのものと変わらない。)

Shift JIS で二バイト文字の上位バイトが取り得る値は、0x81〜9F と 0xE0〜EA。QR‐コードでは まづこれを 0x00〜29 にマップする。下位バイトは 0x40〜FC で、これを 0x00〜BC にマップすると考えてよい(枠としては 0xBF まで入る)。上位バイトの値に 0xC0 を乗じ、下位バイトと足し合わせる。つまり結果の値は、0xC0 で割った整数の商が上位成分で、余りが下位成分となる。

kikakurui.com/x0/X0510-2018-01
この 27 ページ、「7.4.6」の辺りに記述されてる。JIS X 0510 の規格書を HTML に変換した物なので、一部の組み版が崩れて読みにくいけど。

Web site image
JISX0510:2018 情報技術-自動認識及びデータ取得技術-QRコード バーコードシンボル体系仕様
18:01:40 19:22:54
icon

この変換方法では、元になる符号の上位バイトが最大 0xEB の場合(空きを詰めたマッピング後で最大 0x2A の場合)に、13 ビット(すなわち 0x1FFF 以下)に収まる(なぜなら 0x2A × 0xC0 = 0x1F80)。もし 0xEC があったら 14 ビットに溢れる(なぜなら 0x2B × 0xC0 = 0x2040)。

元々 JIS X 0208 の枠組みは 94 区まで定義できるけど、実際には 84 区までしか文字が埋まっていない。その結果として Shift JIS の上位バイトも 0xEA で終わり、そのお陰で 13 ビットに収まる。これは偶然の幸運なのかな。JIS X 0213 は 85 区以降も使うので収まらない。(でも九区などに追加された文字は収まるし、使えるなら有用ではある。)

18:02:31
icon

なお〈0x〉という接頭辞は、16‐進法で表記した数値である事を意味します。

18:37:25 19:30:40
icon

JIS X 0208 が 84 区で終わってるだけでなく、第 84 区の中に六文字しか定義されてないのも大事…と思ったけど、それが当てはまるのは 86 区か。換算がずれてた。(混乱を招くのでこの投稿を加筆修正しておく。)

第 86 区に最大の 94 字まで詰め込んであったら溢れる。Shift JIS で言うなら 0xEB9F 以降、0xEBBF までなら QR‐コードの漢字モードに収まるけど、0xEBC0 が存在したら溢れる。