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コードのバージョン(種類)は、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文字の出力が可能であり、出力する文字列に合わせて、適宜設定を変更する必要があるみたいでした。