「ひとかじりのりんご」

へっぽこエンジニアの備忘録。こちらは旧ブログ。新しい方はこちら→「http://sbkro.github.io」

QR Code Generatorで「code length overflow.」が頻発するので調べてみた。

前回の記事で、QR Code Generatorを使って、JavaからQRコードを出してみました。
しかし、変換する文字列が長すぎる場合、下のような例外が発生してしまいます(´・ω・`)

Exception in thread "main" java.lang.IllegalArgumentException: code length overflow. (340>72)
	at com.d_project.qrcode.QRCode.createData(QRCode.java:423)
	at com.d_project.qrcode.QRCode.make(QRCode.java:209)
	at com.d_project.qrcode.QRCode.getBestMaskPattern(QRCode.java:171)
	at com.d_project.qrcode.QRCode.make(QRCode.java:161)
	at jp.sbkro.qr.QRTeset.main(QRTeset.java:24)

それで、原因を調査してみたのですが、QRCodeクラスに与えるパラメータによって、表示できる文字数が異なることが分かりました。

以下、デンソーウェーブさんによるQRコード仕様の説明です。

QRコードのバージョン(種類)は、1から40まで設定されており、
それぞれのバージョン毎にセル構成(セル数)が決められています。
(セルとは、QRコードを構成している四角い黒白の点のことです。)

「セル構成」とは、コード中のセルの数です。
バージョン1(21セル×21セル)から始まり、
縦横それぞれ4セルずつ増えていき、
バージョン40(177セル×177セルまで設定されています。

QRコードの各バージョンは、データ量・文字種、また誤り訂正レベルに
対応した最大入力文字数が設定されています。つまりデータ量が増えると、
QRコードを構成するセルがたくさん必要になり、QRコードが大きくなっていきます。

上記の「バージョン」は、QR Code Generatorにおける「型番」に相当します。
つまり、QRCodeクラスの以下のメソッドで設定した値によって、最大表示数が変動します。

  • setTypeNumber(int typeNumber) ... バージョン
  • setErrorCorrectLevel(int errorCorrectLevel) ... 誤り訂正レベル
  • addData(String data, int mode) ... 文字種

最大表示数ですが、以下のページにまとめられています。

ソースを見たところ、QR Code Generatorは、バージョン10までの対応なので、最小4文字・最大652文字の出力が可能であり、出力する文字列に合わせて、適宜設定を変更する必要があるみたいでした。

まとめ

  • QRコードのバージョンや訂正レベルによって、表示できる文字数が異なる。
  • QRコードに変換したい文字数によって、適切なパラメータ(型番、訂正レベル、文字の種類)をQRCodeクラスへ設定する必要がある。
  • 特に、QRCodeクラスをコンストラクタからインスタンス化したとき、型番が1になるので注意すること。