QRコードジェネレーター
QRコードを生成し、その裏側の判断を表示します。モード分割、バージョン、誤り訂正レベル、8つのマスクの評価、中央のロゴが実際に払う代償まで。
https://seladevtools.com/qr-code-generator
バージョン3 · 29×29 モジュール · レベルM · マスク7
- バージョン
- 3 · 29×29 モジュール
- レベル
- M
- マスク
- 7(減点が最小)
- データ
- 352ビット中348ビット
- コードワード
- データ44 + 訂正26、1ブロック
セグメント
| モード | 文字数 | ビット |
|---|---|---|
| byte | 42 | 348 |
マスクの減点
| マスク | 連続 | ブロック | 位置検出に似た形 | 偏り | 合計 |
|---|---|---|---|---|---|
| 0 | 325 | 351 | 120 | 0 | 796 |
| 1 | 331 | 375 | 280 | 0 | 986 |
| 2 | 294 | 345 | 280 | 0 | 919 |
| 3 | 322 | 345 | 160 | 0 | 827 |
| 4 | 330 | 330 | 120 | 0 | 780 |
| 5 | 312 | 348 | 160 | 0 | 820 |
| 6 | 322 | 351 | 320 | 0 | 993 |
| 7 | 289 | 273 | 160 | 0 | 722 |
4つの規則は、同色が長く続くこと、2×2のかたまり、スキャナーが位置検出パターンと取り違える1:1:3:1:1の並び、そして暗いモジュールの割合が半分から離れることを減点します。最小が採用されます。行をクリックするとそのマスクに固定できます。
すべてのQRコードには4つの判断が隠れている
QRジェネレーターにテキストを貼り付けると白黒の四角が出てきます。しかし表示されないのは、エンコーダーがたった今あなたの代わりに4つの独立した判断を下したという事実です。どれも結果を変えるものであり、どれも別のやり方があり得たものです。
このツールは4つすべてを表示します。そこが面白いところだからです。いったん見えるようになると、恣意的に思えた挙動 — 1文字足しただけでコードが一段大きくなる、あるロゴは通るのに次のコードでは通らない — が恣意的ではなくなります。
- モード分割: 規格は文字を詰める方法を4つ定めており、テキストはそのあいだで分けられます。
- バージョン: 1から40までの数で、グリッドを21×21から177×177モジュールの範囲に固定します。
- 誤り訂正レベル: L、M、Q、Hのいずれかで、シンボルがどれだけ壊れても読めるかを決めます。
- マスク: データの上にXORで重ねる8つのパターンの1つで、スキャナーを惑わせる形を崩します。
4つのどれも好みの問題ではありません。ほかの3つが決まれば、それぞれに正しい答えがあります。だからこそ見る価値があります。互いに影響し合うのです。
テキストの分割は最短経路問題
数字モードは3桁ごとに10ビットを使います。英数字モードは2文字ごとに11ビットで、対象は45文字 — 数字、大文字、空白、そして9つの記号です。バイトモードはUTF-8の1バイトあたり8ビット。kanjiモードは、バイトモードなら24ビットかかる文字を13ビットで済ませます。
ですから最も安い符号化が文字列全体で1モードになることはまれです。とはいえ切り替えも無料ではなく、セグメントごとに4ビットのモード指示子と文字数フィールドを払います。数字の並びを切り出す価値があるかどうかは、その長さ次第です。これは分割を最短経路問題にし、このエンコーダーは経験則で当てずっぽうにするのではなく厳密に解きます。
HELLO12345678901234567890 as one alphanumeric segment 4 + 9 + (11 x 12) + 6 = 151 bits split at the digits 4 + 9 + (11 x 2) + 6 = 41 bits 4 + 10 + (10 x 6) + 7 = 81 bits total = 122 bits
29ビット。バージョン1では入るか入らないかの差です。ページのセグメント表には、エンコーダーが実際に選んだ分割と各セグメントの費用が出るので、どの文字が高くつくのかが見えます。
バージョンと分割は追いかけ合う
ここが素朴なエンコーダーを間違わせるひねりです。文字数フィールドは幅が固定ではありません。バイトモードではバージョン1から9で8ビット、バージョン10からは16ビット。数字モードは同じ境界で10、12、14と変わります。
つまり分割の費用はバージョンに依存し、バージョンは分割の費用に依存します。抜け道は、バージョンのグループが3つしかないと気づくことです。分割はグループごとに一度ずつ計算し、そのいずれかが収まる最小のバージョンが勝ちます。
- バージョン1–9: 数字10ビット、英数字9、バイト8、kanji 8。
- バージョン10–26: 数字12、英数字11、バイト16、kanji 10。
- バージョン27–40: 数字14、英数字13、バイト16、kanji 12。
マスクは4つの減点規則で選ばれる
QRコードのデータはほぼランダムで、ランダムな白黒はスキャナーが探している構造パターンと取り違えられる形を生みます。対策は、そうした形を崩すために選ばれた規則的なパターンをデータ領域にXORで重ねることです。パターンは8つあり、エンコーダーはすべて試します。
マスクをかけた各シンボルは規格の4つの規則で採点され、合計が最も低いものが勝ちます。ページの表には8つの点数が規則別の内訳とともに出ており、行をクリックするとそのマスクに固定して効果を確かめられます。
- 連続: 行または列で同色のモジュールが5つ続くと3点、それを超える1モジュールごとに1点。
- ブロック: 単色の2×2の領域ごとに3点。
- 位置検出に似た形: 明るいモジュール4つに隣接する暗-明-暗-明-暗の1:1:3:1:1の並びに40点 — 隅の四角に似たパターンです。
- 偏り: 暗いモジュールの割合が半分から離れるごとに、5%ごとに10点。
ここは実装によってわずかに解釈が分かれます。1:1:3:1:1のパターンをより大きな尺度でも数えるのか、そして形式情報を点数に含めるのか、という点です。このエンコーダーは大半のスマートフォンカメラで動いているZXingの解釈に従い、独立した2つの実装に対して固定されています。この食い違いが無効なコードを生むことは決してなく、読み取り可能な複数のマスクのうちどれが選ばれるかを決めるだけです。
中央のロゴが実際に払う代償
誰もが同じ規則を繰り返します。レベルHは30%を復元するから、コードの30%までは覆える、と。これは答えの形が間違っており、それに従えばいずれ読めないコードを渡されることになります。
QRコードの誤り訂正は1つのプールではありません。データはReed-Solomonブロックに分割され、それぞれが自分の訂正コードワードを持ち、ブロックはグリッド全体に交互配置されます。傷が1つのブロックを大きく壊すのではなく、複数を少しずつ壊すようにするためです。各ブロックは訂正コードワードのおよそ半分まで失っても再構成できます。中央のロゴは詰まった四角であり、まさに交互配置が散らそうとした形ですが、散り方が均等になることは決してありません。
ですから問うべきはシンボルの何割が覆われたかではありません。最も被害の大きいブロックがどれだけ失ったかです。このページはどのモジュールがどのコードワードに属し、そのコードワードがどのブロックから来たかを知っているので、直接答えられます。ロゴをアップロードすれば、ブロックごとの被害と最悪のブロックに残った余裕が表示されます。
- 位置検出パターン、タイミングパターン、形式情報を覆うのは予算の問題ではありません。そこには誤り訂正がなく、それらを見つけられないスキャナーは訂正の段階にすら至りません。
- コードワードの半分という数字は上限です。印刷、反射、曲面、摩耗も同じ予算を使うので、画面上でちょうど限界のコードは、マグカップの上では限界を超えています。
- 大きなロゴのためにレベルをHへ上げるとシンボルが大きくなり、同じ印刷サイズならモジュールが小さくなります。得ではなく損になることもあります。
ペイロード形式と、その落とし穴
Wi-FiのQRコードも連絡先カードも、スキャナーが認識する形に整えたテキストにすぎません。形そのものは単純です。実際のコードが壊れるのはエスケープ規則のところで、しかもそれは無言の失敗です。コードはきれいに読み取れて、間違った答えを返します。
WIFI:T:WPA;S:Cafe\; Bar;P:p\:ssw\,rd;; BEGIN:VCARD VERSION:3.0 N:Lovelace;Ada;;; FN:Ada Lovelace ORG:Analytical Engines\, Ltd END:VCARD
Wi-Fi形式ではセミコロンがフィールドを終わらせるので、それを含むパスワードはエスケープしないと認証情報を途中で切ってしまいます。カンマ、コロン、引用符、バックスラッシュも同じです。16進数字だけからなるネットワーク名は引用符で囲む必要があり、そうしないとテキストではなく16進値として読まれます。vCardでは区切りがセミコロンとカンマで、75オクテットを超える行は空白で始まる継続行へ折り返さねばならず、行末はCRLFです。
ここのビルダーはそれらをすべて適用し、何をしたかを伝えます。あなたの入力を黙って書き換えたりはしません。フィールドの下に指摘が出たなら、テキストの何かが手当てを必要としたということです。ステッカーを千枚刷る前に知っておく価値があるでしょう。
よくある質問
- 1文字足しただけでコードが大きくなったのはなぜ?
- モード分割かバージョン、あるいはその両方が変わったからです。すべて大文字の文字列に小文字を1つ加えると、セグメント全体が英数字モードからバイトモードへ押し出されることがあり、1文字あたり5.5ビットが8ビットになります。バージョン9から10へ移ることでも、文字数フィールドがすべて広がります。ビットがどこへ行ったかはセグメント表に出ます。
- 誤り訂正レベルはどれを選べばいい?
- Mが妥当な既定で、実際に世に出ているコードの多くもMです。小さく印刷する、曲面に貼る、手で触れられる物に付ける、あるいは中央をロゴで覆うときはQかHにしてください。Lはペイロードが長く、画面から読ませるときだけにします。レベルを上げても信頼性が無料で上がるわけではありません。同じデータでシンボルが大きくなり、同じ印刷サイズなら1モジュールは小さくなります。
- 中央に置けるロゴの大きさは?
- アップロードすればページが答えます。正直な答えはバージョン、レベル、ブロックがどこに落ちるかに左右されるからです。ページがしないのは30%規則を繰り返すことです。あれは面積ではなくコードワードの話であり、最悪のブロックではなくシンボル全体の話です。目安としては、レベルHで一辺の15%はたいてい快適、25%はたいてい無理です。
- URLを大文字にすると本当にコードが小さくなる?
- よくあります。英数字モードには小文字がないので、小文字のURLは1文字8ビットのバイトモードへ行き、大文字なら5.5ビットの英数字モードに収まります。スキームとホストは大文字小文字を区別しないので、HTTPS://EXAMPLE.COMはhttps://example.comとまったく同じに働きます。ただしパスは区別するので触ってはいけません。ページはあなたのURLで実際の節約を測り、効果があるときだけ変更を提案します。
- 日本語にkanjiモードを使う価値は?
- あります。バイトモードのUTF-8が24ビットのところを1文字13ビットで済むので、日本語テキストはほぼ半分の大きさになります。対象はShift_JISの2バイト範囲で、かな、JIS X 0208の漢字のほか、ギリシャ文字とキリル文字も含みます。このページはテキストが純粋なASCIIでないときにだけ対応表を読み込むので、URLだけのコードがそれをダウンロードすることはありません。
- UTF-8の宣言は有効にすべき?
- たいていは不要です。規格はECIヘッダーが別を告げない限りバイトモードはISO-8859-1だとしていますが、実際には今世紀のスキャナーはどれもUTF-8として扱い、このエンコーダーもそう書きます。明示的な宣言は12ビットかかり、古い産業用読み取り機を混乱させます。ECI対応を明記した特定の読み取り機を狙うときだけ有効にしてください。
- Micro QRや分割コードがないのはなぜ?
- どちらも規格には存在し、どちらも読み取れないものを渡すことになるからです。Micro QRは容量表もマスク集合も形式符号化も独自の別のシンボル体系で、多くのスマートフォンのカメラアプリは読みません。Structured Appendは最大16個のシンボルにペイロードを分けますが、それを組み直す一般向けスキャナーはほとんどありません。データがバージョン40に入らないなら、答えはコードにURLを入れてデータはその先に置くことです。
- QRコードはどれくらい小さく印刷できる?
- 一般的な指針は、印刷では1モジュール0.4mm以上、コードの大きさは読み取り距離の約10分の1をバージョンの寸法で割った値、というものです。ただし実務上の制約はクワイエットゾーンです。規格は四方に4モジュールの余白を求めており、現実で最も多い失敗は、ほかの版面にぴったり寄せられたコードです。この計算に必要なバージョンとモジュール数はページに出ています。