ちょっと気になったので QR コードの符号化方式について調べてみたのでメモ。
けれども、以下に書くことは不正確なので注意。正しく知りたい場合は JIS X 0510 を当たるなどしてください。
発端は「QR コードは Shift-JIS で記録している」という記述をどこかで見たこと。で、実際のところどうなのだろう?とか思って調べてみた。
結論としては、QR コードの符号化方式は、数字, 英数字, 漢字, バイト列 の 4 つのモードがあるらしい。
以下、それぞれの大雑把 (= つまり甚だ正確ではない) にどういうことをしているかまとめる。
- 数字モード
10 進数 3 桁を 10 bit で表現する。
1000 通り < 1024 (2^10) ということ。 - 英数字モード
数字、英大文字および記号、計 45 字 2 桁を 11 bit で表現する。
45^2 = 2025 通り < 2048 (2^11) ということ。 - 漢字モード
Shift-JIS 領域 (JIS X 0208) の文字 1 桁を 13 bit で表現する。
JIS 第 1 水準 + 第 2 水準 + 非漢字 で 6,879 文字らしいから、8192 (2^13) で入るということで。 - バイトモード
8bit を表現。
漢字モードでは Shift-JIS コードをもとに計算しますよ、ということらしいので「Shift-JIS で記録」と称している模様。なので Shift-JIS のコードそのものが記録されているわけではない点に注意。
もっともどんなコードで記録されているかを意識する必要はないかとは思います。それよりは記録される文字の範囲は気にしておく必要がありそうです。
それよりも残るバイトモードとは何なのか。
以下のようなものが入るらしい。
- 漢字モードで入れることのできなかった領域の Shift-JIS 文字
- Unicode 他 Shift-JIS 以外のエンコード方式の文字
- 英小文字
バイトモードというからバイトストリーム的なものが入るのかとおもったら、そういうことではなくて、基本は他のモードで入れられなかった文字がここに入る、といった趣の模様。
しかしそうすると、このバイトモードに格納されている文字の文字コードは何? ということになるわけですが、しかしエンコード方式を QR コード内に記録するところはなさそうなので、アプリケーション側でよしなに…、ということっぽい。 ( よく調べてないので違うかもしれませんが )
もちろんアプリケーション固有で解釈できる、ということはバイトストリーム的な扱いも可能なわけですが。
とはいえ、この領域は多くは QR リーダー内で処理されているでしょうから手が出ない気がしますが… ( 実際はどうなのでしょう? )
JSON や XML のような文書構造もなさそうなので、必要であればアプリケーション側で実装、ですね。
調べた感想としては、3桁まとめて符号化して容量を減らす、などのアイデアが面白いな、よく考えられているな、って感じでした。
あと、ASCII 領域である英小文字がバイトモードの領域 (= 符号化方式不明な領域 ) にしか入らない、って点も意外でした。